2017-09-12 32 views
0

我正在嘗試調用一些本地bash腳本,這些腳本是爲遠程服務器上的健康檢查應用程序編寫的。使用subprocess.Popen()從文件讀取輸入ssh

ssh -q <servername> "bash -s" -- < ./path/to/local/script.bash 

上面的命令行運行非常好。然而,當我在包裹蟒蛇的號召,我不斷收到錯誤,指出:

bash: /path/to/file/script.bash: No such file or directory 

至於我的蟒蛇,我使用的子模塊。 Python:

bashcmd="ssh -q %s \"bash -s\" -- < ./%s" % (<server>,<bashfilepath>) 
process=subprocess.Popen(bashcmd.split, stdout=subprocess.PIPE) 
output, error = process.communicate() 

任何幫助,將不勝感激!

+0

你爲什麼要在'bashfilepath'值前加一個明確的'./'?首先刪除它,並確保你的'bashfilepath'值是正確的。 – roaima

+0

@roima這個問題真的是關於如何用Python'subprocess.Popen()'設置'stdin'。問題是shell中的例子工作正常。我在Python程序的答案中提供的更改解決了這個問題。這個問題沒有正確使用Python API。關於[off-topic]的幫助頁面(https://unix.stackexchange.com/help/on-topic)在shell腳本之外的編程問題上說:「*如果你的問題是一個編程問題,需要其他編程語言的知識而不是unix shell腳本語言,請問Stack Overflow。*「 – sebasth

回答

2

第一個示例中的重定向由shell完成。 ssh的標準輸入從文件./path/to/local/script.bash讀取,其中ssh傳遞給遠程機器上的進程。

您不能使用shell重定向,因爲您沒有從shell運行命令。相反,您可以使用stdinstdout參數Popen()爲您的過程設置標準輸入和輸出。您需要打開文件,然後將句柄傳遞給stdin。解釋如下:Using files as stdin and stdout for subprocess

在Python的例子,你通過ssh -q <server> "bash -s" -- < ./<filepath>作爲第一個參數來subprocess.Popen(),其中節選的參數列表,或者一個字符串:該路徑可執行。您得到No such file or directory錯誤,因爲您的字符串參數不是可執行文件的路徑。遵循標準慣例的正確格式是subprocess.Popen(["/path/to/executable", "arg1", "arg2", ...])

這一切放在一起,你的榜樣應該是這個樣子:

with open("./path/to/local/script.bash") as process_stdin: 
    p = subprocess.Popen(["/usr/bin/ssh", "-q", server, "--", "bash", "-s"], 
         stdin=process_stdin, stdout=subprocess.PIPE) 
    out, err = p.communicate() 

這一切都是Python文檔在subprocess module解釋。

+0

那麼我究竟會傳入什麼參數? – bngrngrufio

+0

謝謝!!像魅力一樣工作。 – bngrngrufio

+0

我將如何傳遞參數與提到./path/to/local/script.sh? – bngrngrufio