
次のように、mysql トラフィックをキャプチャし、それらのトラフィックを strings コマンドに渡そうとしています。
tcpdump -i any -s 0 -l -w - dst port 3306 | strings
これは期待通りに動作し、すべてのmysqlクエリを次のように出力します。
select * from mytables
show databases
しかし、出力をファイルにリダイレクトしようとすると、出力が/tmp/out
ファイルに印刷されません。
tcpdump -i any -s 0 -l -w - dst port 3306 | strings > /tmp/out
上記のコマンドの動作と、出力がファイルにリダイレクトされない理由を説明していただけますか。
答え1
解決策を見つけました:
実は文字列コマンドはバッファリングしています。私は次のようにしてバッファリングを無効にしました。
stdbuf -i0 -o0 -e0 command
したがって、コマンド全体を次のように変更すると、出力が /tmp/final ファイルに送信されるようになりました。
tcpdump -i any -s 0 -l -w - dst port 3306 | stdbuf -i0 -o0 -e0 strings > /tmp/final