3

SSH デバッグ情報を他の入力とは分けて (ログに記録して) 保持したい。ただし、単純に stderr をログ ファイルにリダイレクトすると、SSH からの出力とホスト マシン上のリモート プロセスからの出力を組み合わせる危険があります ( stderr に何かが送信される可能性があります)。

$ ssh -v somemachine 2> file.log

したがって、「debug1」に一致する行のみを除外したいと思います。

$ ssh -v somemachine | awk '/debug1/ {print > "file.log"; next} {print}'

ここまでは問題ありませんが、ssh のデバッグ出力は stderr に出力されます。そう...

$ ssh -v somemachine 2>& | awk '/debug1/ {print > "file.log"; next} {print}'

また失敗!stdout と stderr を混在させたくありません。悪い!

私のような子供は何をしますか?私は名前付きパイプまたはそのような野生のルートに行こうとしていましたが、実際に知る必要があるのは、awk を stderr のみからのパターンに一致させる方法だけです。

4

3 に答える 3

6

Awk は、stderr からの入力を実際には見ることができません。パイプは stdout のみをパイプします。やりたいことを行うには、リダイレクトをいじる必要があります。標準出力の内容を気にしないのであれば、答えは非常に簡単です。

(ssh -v hostname somecommand > /dev/null) 2>&1 | awk '/debug1/ ...'

stdout にあるものに関心がある場合は、もっと複雑なことを行う必要があります。私はこれがうまくいくと信じています:

((ssh -v hostname somecommand 1>&3) 2>&1 | awk '/debug1/ ...' 1>&2) 3>&1

順番に、これらのリダイレクトは次のとおりです。

  • 元の stdout をファイル記述子 3 にリダイレクトします
  • awk が確認できるように stderr を stdout にリダイレクトします
  • stdout を stderr にリダイレクトします (元の場所)
  • ファイル記述子 3 を標準出力 (元の場所) にリダイレクトします。

PS このソリューションは sh/bash 固有です。Jonathan Leffler は、ksh でも動作するはずだと述べています。別のシェルを使用している場合は、そのシェルで同じリダイレクトを行うための構文を見つけることができますが、その別のシェルが csh/tcsh の場合は、おそらく失敗しています。cshell は stdout/stderr の処理が苦手なことで有名です。

于 2010-03-24T14:40:11.757 に答える
0

どうもありがとう..!awk で ls を使用しましたが、リダイレクトできませんでした。

私が使用した:

FILES=`ls -lrt *.txt | awk '{print $9}' 2>> /dev/null`

今:

FILES=`ls -lrt *.txt 2>> /dev/null | awk '{print $9}'`
于 2012-08-14T10:51:33.540 に答える
0

これを試してください(サブシェルなし):

{ ssh -v somemachine 2>&1 1>&3- | awk '/debug1/ {print > "file.log"; next} {print}'; } 3>&1

また

{ ssh -v somemachine 2>&1 1>&3- | grep debug1 > file.log; } 3>&1

これを参照してください。

于 2010-03-24T17:46:20.477 に答える