
tcpdump
pcap ファイルを読み取るために を使用すると、STDOUT と STDERR の両方をリダイレクトしても、コマンドが何らかの方法でコンソールに情報を出力してしまうことに気付きました。実行するたびに" " が出力されないようにするtcpdump
にはどうすればよいですか?tcpdump
reading from file capture, link type EN10MB (Ethernet)
たとえば、次のコマンドは、何も出力されないはずの行を出力します。
$ tcpdump -A -r capture.pcap | grep interesting-string > /dev/null 2>&1
reading from file capture.pcap, link-type EN10MB (Ethernet)
この行はスクリプトの出力に不要なノイズを追加するので、この行が表示されないようにしたいと思います。マニュアル ページを確認しましたが、このメッセージが表示されないようにするオプションは見つかりませんでした。STDOUT と STDERR によってキャプチャされない出力を抑制する方法を Web で検索したところ、いくつかヒットしましたが、このコンテキストで理解したり使用したりできるものはありませんでした。
答え1
出力リダイレクトをパイプの前に置いて、grep ではなく tcpdump の出力に適用するようにするとよいと思います。
tcpdump -A -r capture.pcap 2>&1 | grep interesting-string > /dev/null
答え2
Spiff の回答のより詳細なバージョン:
パイプラインがある場合
command1 | command2
コマンド1の標準出力ですが、ない標準エラーは、コマンド 2 の標準入力に向かうパイプにリダイレクトされます。
だからもしあなたが
command1 | command2 >/dev/null 2>&1
これは、コマンド 2 の標準出力を に送信し/dev/null
、標準エラーを標準出力が送信されたのと同じ場所 (/dev/null
この場合も に送信される) に送信しますが、コマンド 1 の標準エラーに対しては何も行わず、コマンド 1 の標準出力をコマンド 2 の標準入力にパイプしたままにします。
しかし、コマンド
command1 2>/dev/null | command2 >/dev/null 2>&1
は、コマンド1の標準出力をコマンド2の標準入力に、コマンド1の標準エラーを に/dev/null
、コマンド2の標準出力とエラーを に送信し/dev/null
、コマンド
command1 2>&1 | command2 >/dev/null 2>&1
は、コマンド 1 の標準出力をコマンド 2 の標準入力に送り、コマンド 1 の標準エラーをコマンド 1 の標準出力と同じ場所、つまりコマンド 2 の標準入力に送り、コマンド 2 の標準出力とエラーを に送ります/dev/null
。
例えば
tcpdump -A -r capture.pcap 2>&1 | grep interesting-string > /dev/null 2>&1
grep
は の標準出力とエラーの両方を表示します(tcpdump
つまり、reading from file...
メッセージが表示され、興味のある文字列がメッセージの一部である場合は一致します)。また、 の標準出力とエラーをgrep
に送信し/dev/null
ます。そのため、どれでも出力では、終了ステータスのみが表示されますgrep
(これが意図していることだと思います。つまり、知りたいのは、興味のある文字列がいずれかのパケットの一部であるかどうかだけです)。
ところで、与えられた文字列が入力の一部であるかどうかを調べるために を使用しgrep
、出力は不要である場合は、grep -q
のバージョンがgrep
サポートしていれば を使用してください。その方が高速に動作します。
grep
;への書き込みに CPU 時間を費やす必要はありません/dev/null
。grep
grep
文字列を見つけるとすぐに終了する可能性があるため、それ以上CPU時間を消費して読み取らず、tcpdumpは終了した後に「パイプが閉じています」というエラーで終了します。それファイルの読み取りに CPU 時間やディスク/SSD 帯域幅を費やす必要がなくなります。
( の古いバージョンは同じ目的でgrep
使用されていましたが、UNIX 標準では であり、ほとんどの UNIX および UNIX 系システムは現在そのようにしています。たとえば、GNU は を使用します。)-s
-q
grep
-q