2008-08-27 6 views
9

私は、すべてのstderrストリームを対話型bash(理想的には呼び出し元の親プロセス)にリダイレクトする方法を探しています。すべてのstderrをbashでリダイレクトする方法は?

個々のコマンドからstderrストリームをリダイレクトする必要はありません。各コマンドに2> a_fileを追加することで可能です。

デフォルトでは、これらのstderrストリームは対話型bashのstdoutにリダイレクトされます。私はstdoutがエラーメッセージによって汚染されるのを防ぎ、それらを別々に扱うことができないように、このインタラクティブなbashプロセスのstderrでそれらを入手したいと思います。

アイデア?

私はまだ答えを見つけていません...しかし、実際にはttyパラメータです。誰もがstderrを扱うためのtty /対話シェルの責任について知っていますか?

+0

あなたは、あなたがに使用しているどのようなコードを示すことができた、コメントでのpythonに言及これらのSSHストリームを作成します。 popen/popen2/popen3を使用していませんか? – jtimberman

答えて

4

あなたは、そのプロセスの標準エラー出力をリダイレクトする新しいbashのプロセスを起動できます。

$ bash -i 2> stderr.log 
    $ 
7

はbashでexec組み込みを使用します。

exec 2> /tmp/myfile

2

はそうのように、二重引用符であなたのコマンドを試してみてください。

ssh remotehost "command" 2>~/stderr 

テスト済みリモートホスト上に存在しないファイルを使用している私のローカルシステムで。

$ ssh remotehost 'ls nosuchfile; ls /etc/passwd' >/tmp/stdout 2>/tmp/stderr 
$ cat /tmp/stdout 
/etc/passwd 
$ cat /tmp/stderr 
nosuchfile not found 
+0

sshの直後にコマンドを入力すると、リモートホストにシェルをロードしていません。コマンドはsshチャネルを通じて直接実行されます。 私はpythonでparamikoを使用していますが、これは同じです。 私の問題は、多くのコマンドを実行するには対話シェルが必要であり、それでもstderrを取得することです。 –

2

私はそれが設計どおりに動作し、あなたの問題が表示されないのですか?

0

は、リモートエンドで擬似TTYを作成するssh -tをしようとしました:

$ ssh remotehost "tail x;head x" 2>~/stderr 
$ cat stderr 
tail: cannot open `x' for reading: No such file or directory 
head: cannot open `x' for reading: No such file or directory 
2

2つのこと:「壊れた」バックアップが得られ、地元のtarファイルの内部で終わるエラーでリモートsshコマンドの結果で2>&1を使用して

  1. sshの反対側にリダイレクトを適用する場合は、redirectコマンドをエスケープしてください。

リモート側のstderrをファイルにリダイレクトし、エラーが発生した場合は後でそれを受け取ることをお勧めします。

例:

ssh -t remotehost tar -cf - /mnt/backup 2\>backup.err > localbackup.tar 
EXITSTATUS=$? 
if [ $EXITSTATUS != "0" ] then 
    echo Error occurred! 
    ssh remotehost cat backup.err >localbackup.errors 
    cat localbackup.errors 
    ssh remotehost rm backup.err 
else 
    echo Backup completed successfully! 
    ssh remotehost rm backup.err 
fi 
2

Iは、 '()'、良い方法は、括弧でコマンドを囲むことである見つける(サブシェルを起動する)またはカーリー・ブレース、 '{}'(NOサブ-shell;速い):もちろん

{ 
    cmd1 
    cmd2 
    ... 
    cmdN 
} 2> error.log 

、これは1行で行うことができます。

{ cmd1; cmd2; ... cmdN; } 2> error.log 
関連する問題