gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:17:01 25 4
gpt4 key购买 nike

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

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

上面的命令在命令行中运行得很好。但是,当我用 python 包装调用时,我不断收到错误消息:

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

至于我的 python,我使用的是 subprocess 模块。 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 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()

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

关于python - 使用 subprocess.Popen() 从文件中读取 ssh 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46200281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com