我认为这不是一个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
似乎没有定义。
答案 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
。