簡體   English   中英

在遠程機器 php 上運行 bash 腳本

[英]Run bash script on remote machine php

我想知道是否有人知道使用 php 運行已經在遠程機器上的 bash 腳本的方法。 php 框可以訪問 exec。 我聽說你可以使用 ssh,但我知道它是否安裝在網絡服務器上。 我確實需要將參數傳遞給遠程腳本。

澄清:

  • 我有兩台服務器,A & B
  • A 是一個帶有 php exec 的 webhost,沒有 ssh 客戶端
  • B 是亞馬遜 ec2,我有完全的 root 訪問權限,但它沒有配置網絡服務器

有沒有辦法用服務器 A 上的 php 腳本調用服務器 B 上的 bash 腳本

編輯:我確認我在網絡服務器上沒有 ssh。

http://phpseclib.sourceforge.net/documentation/net.html - SSH2 支持,外部依賴最少。

如果你有 ssh,只需執行exec("ssh username@server command -arg1 -arg2 ..."); . 您需要確保為此設置了身份驗證密鑰以進行無密碼登錄。 您將需要 PHP 服務器上的 ssh 客戶端和遠程計算機上的 ssh 服務器。 如果需要,您應該能夠在沒有 root 訪問權限的情況下安裝 ssh 的客戶端部分,但它是許多系統的標准配置。

有許多解決方案,它們都依賴於配置 B,因為您擁有 root 訪問權限。

例如,在 B 上安裝一個網絡服務器。每當一個頁面 (runBash.php) 被點擊時,它就會運行 bash 腳本。 然后從 A 開始 wget 或 curl 頁面。如果你真的很流暢,你可以添加錯誤檢查以確認它運行正確。 ;)

如果您不能/不會安裝網絡服務器,則必須決定如何連接到 B。流行的選項是 ssh、telnet、ftp、sftp 等。一個小技巧是通過 ftp 將文件上傳到 B ,並在您的 bash 腳本中注意該文件。 檢測到時,運行腳本,刪除文件,然后重復。 或者您可以監視來自您的網絡服務器的 ping(假設是靜態 IP),並在其上觸發 bash 腳本。

有很多選擇可以實現這一點; 我認為最簡單的方法是在 B 上安裝網絡服務器。如果您告訴我們 B 上的操作系統,我們可以就如何安裝網絡服務器提供更好的建議。

一種可能的方法是在服務器 B 上創建一個守護進程,然后檢查 mysql(或其他數據庫)中的更新表,如果存在一行,則運行 bash 腳本,而您只需將一行添加到服務器 b 上的遠程數據庫中執行 bash 腳本的命令,EG:

  1. 服務器 B 每分鍾左右檢查一次更新的“命令”數據庫,運行新腳本和參數等。

  2. 服務器 A 將命令添加到遠程(或本地)數據庫以運行 bash 腳本“/home/mybashscript etc1 etc2”

  3. 由於服務器 B 不斷檢查新命令,它會自動運行 bash 腳本。

啟用從網絡服務器到目標機器的 ssh 訪問並不是解決問題的好方法 - 即使在您考慮安裝客戶端之前。

您沒有提供有關作業頻率的任何信息,也沒有提供未經授權的用戶運行它的影響 - 但您確實應該將要運行 bash 腳本的機器上的暴露限制在必要的絕對最低限度工作。

如果是我,我會編寫一個腳本,通過 [x]inetd 在要運行腳本的機器上運行(使用 [x]inetd 意味着它不需要專用的守護進程,它們通常也是使用 tcpwrappers 支持或類似方法編譯)並實現基於質詢的身份驗證機制(並且還要求發送的任何參數都帶有可驗證/不可重播的哈希值)。

這樣,如果請求端受到損害,可能發生的最壞情況是腳本可以為未知參數運行更多次。

這不是火箭科學 - 但需要一些代碼。

您可以嘗試使用 python socket client server structure 來完成這項任務......使用 python 很容易

你可以使用 php ssh2-functions,看看http://www.php.net/manual/en/function.ssh2-exec.php

您需要 libssh2 才能使用它(參見http://www.php.net/manual/en/intro.ssh2.php

如果訪問服務器 B 的唯一方法是通過 SSH,而您在服務器 B 上沒有任何 SSH 客戶端,則您根本無法做其他事情,然后觀察您的 AMI 實例不斷增加的計費計數器。

 SERVER A <<-------- SSH ------->> SERVER B

或者:

您可以通過PHP AWS API 進行訪問。 可能是,您可以直接訪問您的 AMI。

 SERVER A <<-------- PHP AWS Toolkit ------->> SERVER B

只需使用一些遠程執行工具。 你可能在服務器 B 上安裝了 python。你可以很容易地用 python 制作一個小的 XMLRPC 服務器,這需要大約。 20行代碼。

http://code.activestate.com/recipes/81549-a-simple-xml-rpc-server/

你只需要確保你使用摘要身份驗證或其他東西來保護它,也許另外還有 ssl。

我可能遺漏了一些東西,但我的解釋是您希望 Php 在服務器上啟動 bash 腳本?

編輯:您可以通過調用本地服務器上的 Php 腳本或僅通過自己調用 lynx 來調用遠程服務器上的 Php 文件。 Lynx 是一個命令行瀏覽器。

“本地服務器”:

<? exec(lynx -dump http://remoteserver.com/bash_command.php); ?>

將包含類似內容的 php 文件放在您的遠程服務器 Web 目錄中:

<? exec("bash_command"); ?>

用您的 bash 命令(和參數)替換 bash_command。

PHP 有一個 SSH-Lib - 但是如果在您的網絡服務器上甚至沒有安裝 SSH-Client,我認為您不會有死庫 - 但您應該檢查一下。

如果沒有 - 正如您所說的,服務器 A 上沒有 SSH 客戶端 - 所以您無法建立到服務器 B 的 SSH 連接。

但是您還說您擁有對服務器 B 的完全根訪問權限 - 那么為什么不在服務器 B 上設置網絡服務器呢?

您可以在服務器 A 上執行一個 PHP 腳本,該腳本向服務器 B 發出 HTTP 請求並執行一個 PHP 腳本,該腳本可以啟動您的 bash 腳本。 您可以通過 HTTPS 保護呼叫並通過 PHP 對呼叫進行額外加密。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM