使用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()
任何帮助,将不胜感激!
第一个示例中的重定向由shell完成。 ssh
的标准输入从文件./path/to/local/script.bash
读取,其中ssh
传递给远程机器上的进程。
您不能使用shell重定向,因为您没有从shell运行命令。相反,您可以使用stdin
和stdout
参数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解释。
那么我究竟会传入什么参数? – bngrngrufio
谢谢!!像魅力一样工作。 – bngrngrufio
我将如何传递参数与提到./path/to/local/script.sh? – bngrngrufio
你为什么要在'bashfilepath'值前加一个明确的'./'?首先删除它,并确保你的'bashfilepath'值是正确的。 – roaima
@roima这个问题真的是关于如何用Python'subprocess.Popen()'设置'stdin'。问题是shell中的例子工作正常。我在Python程序的答案中提供的更改解决了这个问题。这个问题没有正确使用Python API。关于[off-topic]的帮助页面(https://unix.stackexchange.com/help/on-topic)在shell脚本之外的编程问题上说:“*如果你的问题是一个编程问题,需要其他编程语言的知识而不是unix shell脚本语言,请问Stack Overflow。*“ – sebasth