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

Correctly getting return code when issuing command over SSH via subprocess

我正在尝试通过 ssh 发出命令并通过子进程获取其 return 代码。我有一些代码如下所示:

cmd = 'ssh user@ip_addr "some_command"'
res = subprocess.check_output(
    cmd,
    shell=True,
    stdout=subprocess.PIPE)

如果 cmd 仅生成退出代码(例如,将 cmd 设置为 "exit 1",然后执行 try/catch 以查看它是否以非零退出,则此方法效果很好。但是,以下无限期挂起:

cmd = 'ssh user@ip_addr "ls -la && exit 0;"'
res = subprocess.check_output(
    cmd,
    shell=True,
    stdout=subprocess.PIPE)

我看到了 two questions that looked similar, and I did RTFM,但我仍然不确定该怎么做。我真的不在乎命令是否生成输出;我更关心退出代码。如果有人知道这样做的最佳方法是什么,或者我是否不恰当地使用了子流程,我将不胜感激。

删除 stdout=subprocess.PIPE,它应该可以工作; check_output 本身捕获输出,因此使用 stdout=subprocess.PIPE 重定向它会导致问题。如果您根本不关心输出,只需使用 subprocess.check_call(同样,不要使用 stdout=subprocess.PIPE)。

请勿使用 std{out,err}=PIPE,除非您从管道中阅读!!!

要获取 return 代码,同时 丢弃 使用 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未使用。