远程命令的子进程模块

时间:2015-07-30 08:10:26

标签: python

我正在尝试使用子进程模块来执行远程命令。我需要执行位于远程服务器上的名为“upgrade”的程序。另外,我需要在该调用中使用一个参数。以下是我尝试这样做的方法:

import subprocess
p=subprocess.Popen(['ssh', '15.36.77.1', './home/upgrade -u' ],stdin=subprocess.PIPE,
stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
stdout,stderr=p.communicate(input='\n')

当我尝试执行此命令并从中获取返回代码时,我得到255,这意味着命令失败。你可以帮我解决这个问题吗? 不应使用第三方库。 抱歉英文不好。

1 个答案:

答案 0 :(得分:0)

我认为您唯一的问题是,在使用shell=True时,您会将subprocess.Popen的所有内容作为字符串执行。使用和不使用shell=True执行此操作的两种方法如下:

subprocess.call(["ls", "-l"])

subprocess.call("exit 1", shell=True)

所以在你的情况下,你需要给Popen的字符串是:

['ssh 15.36.77.1 ./home/upgrade -u']

或者您可以删除shell=True来执行命令:

p=subprocess.Popen(['ssh', '15.36.77.1', './home/upgrade -u' ],
                   stdin=subprocess.PIPE, subprocess.PIPE,stderr=subprocess.PIPE)

请注意,建议不要使用shell=True,因为如果从命令行请求输入,则可能存在安全隐患。请参阅文档中给出的示例:

https://docs.python.org/2/library/subprocess.html#frequently-used-arguments

P.S。你的英语很棒!