tcpdump 本身不支持按绝对时间范围捕获,但可通过 -g 和 -w 实现固定时长捕获、shell 时间判断实现精确启停、editcap 提取已有 pcap 的时间子集,或用 -tttt 实时标记时间。

tcpdump 本身不内置“按绝对时间范围捕获”的功能,但可通过组合系统时间控制、轮转机制与过滤逻辑,精准限定捕获的时间窗口。关键在于用 -G(周期轮转)和 -W(文件数量限制)配合脚本判断起止时间,或借助外部时间戳过滤已保存的 pcap 文件。
用 -G 和 -W 实现固定时长捕获
这是最常用、最可靠的方式:让 tcpdump 每隔固定秒数生成一个新文件,并只保留目标时间段内的那个(或几个)文件。
-
-G 60 表示每 60 秒创建一个新 pcap 文件(文件名自动带时间戳,如
capture-1719856800.pcap) - -W 1 限制最多只保留 1 个文件,旧文件会被覆盖——适合“只抓接下来 N 秒”的场景
- 例如,抓取未来 120 秒的全部流量:
sudo tcpdump -i eth0 -w capture.pcap -G 120 -W 1
运行后等待 120 秒,Ctrl+C 停止,此时capture.pcap就是这 120 秒内的完整记录
捕获时结合 shell 时间判断(精确到秒)
若需在某个具体时间段(如今天 14:30:00–14:32:30)自动启停,可用 while 循环 + date 判断:
- 先获取目标起始和结束时间戳:
start=$(date -d "today 14:30:00" +%s)<br>end=$((start + 150))
- 启动后台捕获:
sudo tcpdump -i eth0 -w window.pcap &<br>pid=$!
- 等待结束时间到达后自动终止:
while [ $(date +%s) -lt $end ]; do sleep 1; done<br>kill $pid
对已有 pcap 按时间范围提取子集
如果已经有一个大 pcap 文件,想从中切出某段时间的数据,用 editcap(Wireshark 工具集自带)最直接:
- 提取从 2026-07-06 10:15:22 开始、持续 90 秒的包:
editcap -A "2026-07-06 10:15:22" -B "2026-07-06 10:16:52" full.pcap window.pcap - 注意:
-A是起始时间(inclusive),-B是截止时间(inclusive),格式必须严格匹配 pcap 中的时间戳格式(通常为YYYY-MM-DD HH:MM:SS) - 可先用
tcpdump -r full.pcap -tttt | head -n 3查看前几行的实际时间戳格式
小技巧:实时显示并标记时间
若只是临时观察、不需要保存,加 -tttt 可在每行输出前显示完整日期时间,方便肉眼定位事件发生时刻:
-
sudo tcpdump -i eth0 -nn -tttt port 80
输出类似:2026-07-06 18:01:22.345678 IP 192.168.1.10.54321 > 10.0.0.5.80: Flags [S] - 配合 -c N 可限制只看前 N 个包,避免刷屏











