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

时间:2017-09-12 18:57:34

标签: python linux shell stdin io-redirection

我正在尝试调用我为远程服务器上的运行状况检查应用程序编写的一些本地bash脚本。

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

上面的命令行运行完全正常。但是,当我在python中包装调用时,我不断收到错误说明:

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

至于我的python,我正在使用子进程模块。 的Python:

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

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

第一个示例中的重定向由shell完成。 ssh的标准输入从文件./path/to/local/script.bash读取,ssh传递给远程计算机上的进程。

您不能使用shell重定向,因为您没有从shell运行命令。您可以使用stdin的{​​{1}}和stdout参数来设置流程的标准输入和输出。您需要打开该文件,然后将句柄传递给Popen()。这在Using files as stdin and stdout for subprocess中解释。

在python示例中,将stdin作为第一个参数传递给ssh -q <server> "bash -s" -- < ./<filepath>,它除了参数列表或单个字符串之外:可执行文件的路径。您收到subprocess.Popen()错误,因为您的字符串参数不是可执行文件的路径。遵循标准惯例的正确格式为No such file or directory

所有这些放在一起,你的例子应该是这样的:

subprocess.Popen(["/path/to/executable", "arg1", "arg2", ...])

这一切都在subprocess module的Python文档中进行了解释。