2015-03-13 88 views
0

我试图通过ssh发出命令并通过子进程获取其返回代码。我有一些代码,看起来像这样:通过子进程通过SSH发出命令时正确获取返回码

cmd = 'ssh [email protected]_addr "some_command"' 
res = subprocess.check_output(
    cmd, 
    shell=True, 
    stdout=subprocess.PIPE) 

现在这个伟大的工程,如果CMD只生成退出代码(例如,设置CMD“退出1”,然后做一个try/catch,看看它退出与非零但是,下面的无限期挂起:。

cmd = 'ssh [email protected]_addr "ls -la && exit 0;"' 
res = subprocess.check_output(
    cmd, 
    shell=True, 
    stdout=subprocess.PIPE) 

我看到two questionslooked similar,我did RTFM,但我仍然不知道做什么,我真的不关心是否或者不是命令生成输出;我更关心退出代码,如果有人知道这样做的最佳方式,或者我是否在使用g子过程不当,我将不胜感激。

+0

'check_output'似乎没有'stdout'参数。你的意思是'stderr'吗? – 2015-03-13 19:05:28

+0

我做到了,对此抱歉。 – 2015-03-13 19:08:54

+1

然后,您需要查看有关** not **使用'stderr = PIPE'的大通知,因为它可能会挂在您指向的链接上。 – 2015-03-13 19:26:09

回答

2

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

+0

'stdout = PIPE'不符合问题中描述的行为。 'stdout = PIPE'会导致* immediate *'ValueError',而不是*“下面的内容会无限期挂起”* - OP没有向我们展示实际的代码。如果它是'stderr = PIPE',那么如果它填充了它的stderr OS管道缓冲区(〜65K在我的机器上,例如'call(['python3','-c','import sys; print(“a “* 10 ** 4,file = sys.stderr)'],stderr = PIPE)'不挂起)。我不明白'ls -la'会在stderr上产生~65K的错误信息。 – jfs 2015-03-14 08:44:19

0

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

要得到的返回码,而丢弃使用subprocess模块发出通过SSH命令的输出:

from subprocess import call, DEVNULL, STDOUT 

returncode = call(['ssh', '[email protected]', 'ls -la && exit 0;'], 
        stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT) 

又见,How to hide output of subprocess in Python 2.7

注:shell=True未使用。