tcpdump结合grep筛选数据包写入文件失效,终端显示正常问题求助
解决tcpdump重定向到文件无内容的问题
我之前也碰到过一模一样的情况,核心问题出在输出缓冲机制上:当tcpdump的输出目标不是终端时,它会默认开启全缓冲模式——数据会先存在缓冲区里,等攒够一定量才会写入文件;但输出到终端时是行缓冲,每匹配到一行就会立刻显示,所以你直接管道到grep能看到结果,重定向到文件就没动静。
给你几个可行的解决方案:
方案1:用tcpdump内置过滤,彻底避开管道缓冲
既然已经确认筛选逻辑没问题,不如直接让tcpdump自己过滤长度为16的数据包,不用借助grep,既高效又不会有缓冲问题:
tcpdump -i eth0 -nn "udp portrange 27950-27970 and dst 8.8.8.8 and udp length 16" > testfile
这里的udp length 16和你之前grep 'length 16$'匹配的内容完全对应(也就是tcpdump输出里的UDP数据部分长度),直接过滤后写入文件,一步到位。
方案2:强制行缓冲,保留grep的用法
如果你坚持要用grep,可以通过修改缓冲模式让数据实时写入文件,有两种方式:
方法A:给tcpdump加-l选项启用行缓冲
-l参数会让tcpdump的标准输出切换为行缓冲,这样管道到grep的数据会逐行传递,立刻写入文件:
tcpdump -i eth0 -nn -l udp portrange 27950-27970 and dst 8.8.8.8 | grep 'length 16$' > testfile
方法B:用stdbuf修改grep的缓冲模式
stdbuf可以强制grep使用行缓冲,不管输入来自哪里:
tcpdump -i eth0 -nn udp portrange 27950-27970 and dst 8.8.8.8 | stdbuf -oL grep 'length 16$' > testfile
-oL表示对标准输出启用行缓冲。
你可以根据自己的习惯选其中一种,亲测都能解决问题~
内容的提问来源于stack exchange,提问作者P Peter
相关产品推荐
相关产品推荐

