我正在尝试使用子进程模块来执行远程命令。我需要执行位于远程服务器上的名为“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,这意味着命令失败。你可以帮我解决这个问题吗? 不应使用第三方库。 抱歉英文不好。
答案 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。你的英语很棒!