使用subprocess.popen()从文件中读取SSH的输入



我正在尝试调用我为远程服务器上的健康检查应用程序编写的少数本地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()

任何帮助将不胜感激!

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

您无法使用shell重定向,因为您没有从shell运行命令。取而代之的是,您可以使用stdinstdout参数for Popen()为过程设置标准输入和输出。您需要打开文件,然后将其传递给stdin。在以下内容中解释了这一点:使用stdin和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文档中的子进程模块

中解释

最新更新