我试图通过ssh发出命令并通过子进程获取其返回代码。我有一些看起来像这样的代码:
cmd = 'ssh user@ip_addr "some_command"'
res = subprocess.check_output(
cmd,
shell=True,
stdout=subprocess.PIPE)
现在,如果cmd只生成一个退出代码(例如,将cmd设置为"退出1",然后执行try / catch以查看它是否以非零退出),则此功能非常有用。但是,以下内容无限期地挂起:
cmd = 'ssh user@ip_addr "ls -la && exit 0;"'
res = subprocess.check_output(
cmd,
shell=True,
stdout=subprocess.PIPE)
我看到了two questions looked similar和did RTFM,但我仍然不确定该怎么做。我不太关心命令是否产生输出;我更关心退出代码。如果有人知道这样做的最佳方式是什么,或者我是否不恰当地使用子流程,我将不胜感激。
答案 0 :(得分:2)
删除stdout=subprocess.PIPE
,它应该有效; check_output
本身捕获输出,因此使用stdout=subprocess.PIPE
重定向它将导致问题。如果您根本不关心输出,只需使用subprocess.check_call
(并且再次使用stdout=subprocess.PIPE
)。
答案 1 :(得分:0)
除非您从管道中读取,否则请勿使用std{out,err}=PIPE
使用subprocess
模块丢弃通过ssh发出的命令输出时获取返回码:
from subprocess import call, DEVNULL, STDOUT
returncode = call(['ssh', 'user@ip', 'ls -la && exit 0;'],
stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT)
另见How to hide output of subprocess in Python 2.7。
注意:未使用shell=True
。