使用`grep`过滤进程的输出,同时保持返回值

时间:2016-11-21 14:09:23

标签: python bash ssh grep return-value

我认为这不是一个Python问题,但为了提供我将告诉的背景,我到底在做什么。

我使用ssh -t <host> <command>在远程计算机上运行命令,如下所示:

if os.system('ssh -t some_machine [ -d /some/directory ]') != 0:
    do_something()

(注意:[ -d /some/directory ]只是一个例子。如果一切顺利,可以用任何返回0的命令替换。

不幸的是ssh打印“连接到some_machine close”。每次我跑它。

我愚蠢地尝试运行ssh -t some_machine <command> | grep -v "Connection",但当然会返回grep的结果。

简而言之:在Python中,我想通过ssh运行一个进程,并在过滤掉一些不需要的输出时评估它的返回值。

编辑: this question建议s.th.喜欢

<command> | grep -v "bla"; return ${PIPESTATUS[0]}

确实,这可能是一种方法,但它似乎只适用于bash。至少zsh PIPESTATUS似乎没有定义。

1 个答案:

答案 0 :(得分:2)

使用subprocess,并使用Python而不是shell管道连接这两个命令。

from subprocess import Popen, PIPE, call
p1 = Popen(["ssh", "-t", "some_machine", "test", "-d", "/some/directory"],
           stdout=PIPE)
if call(["grep", "-v", "Connection"], stdin=p1.stdout) != 0:
    # use p1.returncode for the exit status of ssh
    do_something()

更进一步,尽量避免在不必要时运行外部程序。您可以直接在Python中检查ssh的输出,而无需使用grep;例如,使用re库来检查从p1.stdout读取的数据。您还可以使用像Paramiko这样的库连接到远程主机,而不是外出以运行ssh