stdoutでtcpdumpを使用してリアルタイムでDNS Aレコードを取得したいと思います。
tcpdump -i any dst port 53 | awk '/ A\? / {u = NF - 1; print $u}' | sed 's/.$//g'
上の行には出力がありません。 Tcpdumpはまだパイプなどでバッファリングしているようです。私も-l
--immediate-mode
それをテストしました-U
。
次の行は正しく(ライブ)出力されますが、明らかにフィルタリングされていないようです(grep / awkなし)。
tcpdump -i any dst port 53
上記のawk / sedコマンドに出力ラインを手動で送信すると、正常に動作します。
すべてはArch LinuxとAndroid 8.1(bash、tcpdump 4.9.2)でテストされました。
Q:リアルタイムでtcpdump出力を取得するためにPipe / awk / sedを使用する方法は?
2011年の古いスレッドは切り捨てられません。 TCPDUMP出力をリアルタイムで処理/パイプライン化する方法
答え1
次のバリエーションをお試しください。
tcpdump -l -i any dst port 53 | stdbuf -oL awk '/ A\? / {u = NF - 1; print $u}' | sed 's/.$//g'
tcpdump出力の各行をバッファリングする必要があり、オプションは-l
この目的に使用されます。
からman tcpdump
:
-l Make stdout line buffered. Useful if you want to see the data while capturing it.
awk出力ラインをバッファリングするように設定標準バッファ使用される。
-o, --output=MODE adjust standard output stream buffering
If MODE is 'L' the corresponding stream will be line buffered.