Python 使用subprocess.Popen()从文件中读取ssh的输入
我试图调用我为远程服务器上的健康检查应用程序编写的一些本地bash脚本Python 使用subprocess.Popen()从文件中读取ssh的输入,python,linux,shell,stdin,io-redirection,Python,Linux,Shell,Stdin,Io Redirection,我试图调用我为远程服务器上的健康检查应用程序编写的一些本地bash脚本 ssh -q <servername> "bash -s" -- < ./path/to/local/script.bash 至于我的python,我使用的是子流程模块。 Python: bashcmd=“ssh-q%s\”bash-s\“--
ssh -q <servername> "bash -s" -- < ./path/to/local/script.bash
至于我的python,我使用的是子流程模块。
Python:
bashcmd=“ssh-q%s\”bash-s\“--<./%s”%(,)
process=subprocess.Popen(bashcmd.split,stdout=subprocess.PIPE)
输出,错误=process.communicate()
任何帮助都将不胜感激 第一个示例中的重定向由shell完成。从文件
/path/to/local/script.bash
读取ssh
的标准输入,该文件ssh
传递到远程计算机上的进程
您不能使用shell重定向,因为您没有从shell运行命令。相反,您可以使用Popen()
的stdin
和stdout
参数来设置流程的标准输入和输出。您需要打开文件,然后将句柄传递给stdin
。这在中进行了解释:
在python示例中,您将ssh-q“bash-s”-<./
作为第一个参数传递给subprocess.Popen()
,该参数不包括参数列表或单个字符串:指向可执行文件的路径。由于字符串参数不是可执行文件的路径,因此不会出现此类文件或目录错误。遵循标准约定的正确格式为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文档中进行了解释。第一个示例中的重定向是由shell完成的。从文件
/path/to/local/script.bash
读取ssh
的标准输入,该文件ssh
传递到远程计算机上的进程
您不能使用shell重定向,因为您没有从shell运行命令。相反,您可以使用Popen()
的stdin
和stdout
参数来设置流程的标准输入和输出。您需要打开文件,然后将句柄传递给stdin
。这在中进行了解释:
在python示例中,您将ssh-q“bash-s”-<./
作为第一个参数传递给subprocess.Popen()
,该参数不包括参数列表或单个字符串:指向可执行文件的路径。由于字符串参数不是可执行文件的路径,因此不会出现此类文件或目录错误。遵循标准约定的正确格式为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文档中解释。为什么要在
bashfilepath
值前面放一个显式的/
?首先删除它,并确保您的bashfilepath
值正确。@roima这个问题实际上是关于如何使用Pythonsubprocess.Popen()设置stdin
。问题是,shell中的示例运行良好。我在回答Python程序时所做的更改解决了这个问题。问题在于没有正确使用Python API。“帮助”页上关于除shell脚本以外的编程问题的说明:“如果您的问题是一个编程问题,需要了解unix shell脚本语言以外的编程语言,请询问堆栈溢出问题。”为什么在bashfilepath
值前面放一个显式的/
?首先删除它,并确保您的bashfilepath
值正确。@roima这个问题实际上是关于如何使用Pythonsubprocess.Popen()设置stdin
。问题是,shell中的示例运行良好。我在回答Python程序时所做的更改解决了这个问题。问题在于没有正确使用Python API。“帮助”页面关于除shell脚本以外的编程问题:“如果您的问题是编程问题,需要了解unix shell脚本语言以外的编程语言,请询问堆栈溢出问题。”那么,我到底应该传递什么作为参数呢?我应该如何传递带有提到的./path/to/local/script.sh的参数呢?就像在原始示例中传递参数一样:在“bash”“-s”
之后,例如“bash”“-s”、“arg1”、“arg2”…
。那么,我到底应该传递什么作为参数呢?我应该如何传递带有提到的./path/to/local/script.sh的参数?就像您在原始示例中传递参数一样:在“bash”“-s”
之后,例如“bash”“-s”、“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()