You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:43:18