文字列コマンドの奇妙な動作

文字列コマンドの奇妙な動作

次のように、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 

参考文献

関連情報