我想在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和Android8.1 (bash,tcpdump 4.9.2)上进行了测试。
问:如何使用管道/awk/sed实时获得tcpdump输出?
从2011年起就有一条老线索无法解决这个问题。如何实时处理/管道TCPDUMP输出
发布于 2018-07-17 20:09:11
试试这个变体:
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.https://unix.stackexchange.com/questions/456821
复制相似问题