[英]Run bash script on remote machine php
我想知道是否有人知道使用 php 運行已經在遠程機器上的 bash 腳本的方法。 php 框可以訪問 exec。 我聽說你可以使用 ssh,但我知道它是否安裝在網絡服務器上。 我確實需要將參數傳遞給遠程腳本。
澄清:
有沒有辦法用服務器 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:
服務器 B 每分鍾左右檢查一次更新的“命令”數據庫,運行新腳本和參數等。
服務器 A 將命令添加到遠程(或本地)數據庫以運行 bash 腳本“/home/mybashscript etc1 etc2”
由於服務器 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.