Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用subprocess.Popen()从文件中读取ssh的输入_Python_Linux_Shell_Stdin_Io Redirection - Fatal编程技术网

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

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\“--

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

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这个问题实际上是关于如何使用Python
subprocess.Popen()设置
stdin
。问题是,shell中的示例运行良好。我在回答Python程序时所做的更改解决了这个问题。问题在于没有正确使用Python API。“帮助”页上关于除shell脚本以外的编程问题的说明:“如果您的问题是一个编程问题,需要了解unix shell脚本语言以外的编程语言,请询问堆栈溢出问题。”为什么在
bashfilepath
值前面放一个显式的
/
?首先删除它,并确保您的
bashfilepath
值正确。@roima这个问题实际上是关于如何使用Python
subprocess.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()