通过子进程通过SSH发出命令时正确获取返回码

时间:2015-03-13 18:54:59

标签: python shell ssh subprocess

我试图通过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 similardid RTFM,但我仍然不确定该怎么做。我不太关心命令是否产生输出;我更关心退出代码。如果有人知道这样做的最佳方式是什么,或者我是否不恰当地使用子流程,我将不胜感激。

2 个答案:

答案 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