2016-11-21 2 views
0

これはPythonの質問ではないと私は思っています。返り値を保持しながら `grep`を使ったプロセスの出力を出力します

私はこのような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の結果を返します。

要するに、私はssh経由でプロセスを実行し、不要な出力をフィルタリングしながら戻り値を評価したいと考えています。

編集:this questionが示唆している。 like

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

確かにこれはアプローチかもしれませんが、それはbashでのみ動作するようです。少なくともzshPIPESTATUSは定義されていないようです。

+0

[bash:パイプ出力とキャプチャの終了ステータス]の複製が可能です(http://stackoverflow.com/questions/1221833/bash-pipe-output-and-capture-exit-status) –

+1

sshがそのメッセージを表示していますあなたは '2/dev/null'でnullにパイプすることができます。 sshを使用している '-t'オプションでは、リモートコマンドのstderrをstdoutにリダイレクトして、失われてはいけません。 – ccarton

+0

はい、それは私が今やっていることです。問題は、 'ssh'接続自体に何か問題があった場合に、診断出力を失うことです。 – frans

答えて

2

subprocessを使用し、2つのコマンドをシェルパイプラインではなくPythonで接続します。

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() 

これをさらに進めて、不要なときに外部プログラムを実行しないようにしてください。 sshの出力をgrepを使わずにPythonで直接調べることができます。たとえば、reライブラリを使用して、p1.stdoutから読み取ったデータを調べます。 sshを実行する代わりに、Paramikoのようなライブラリを使用してリモートホストに接続することもできます。

関連する問題