我正在尝试调用我为远程服务器上的健康检查应用程序编写的少数本地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运行命令。取而代之的是,您可以使用stdin
和stdout
参数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文档中的子进程模块。