使用subprocess.Popen()从文件读取输入ssh

问题描述:

我正在尝试调用一些本地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

第一个示例中的重定向由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