我想使用 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)上进行了测试。
问题:如何使用 Pipe/awk/sed 实时获取 tcpdump 输出?
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.