tcpdump - 带管道的实时 DNS 记录器

tcpdump - 带管道的实时 DNS 记录器

我想使用 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.

相关内容