为什么tcpdump没有旋转保存文件?

时间:2017-06-26 20:22:53

标签: pcap tcpdump

我正在尝试让tcpdump使用以下命令根据文件大小和时间轮换大量的pcap文件:

tcpdump -i lo -G 60 -W 5 -C 1 -w /var/tmp/trace

我预计它会在5个不同的日志文件(名为trace0,trace1,trace2等)中旋转,当它们达到最大大小为1M(来自-C选项)或经过60秒后(来自-G)选项)。相反,只创建了trace0,并且在60秒过后它会被覆盖。

根据手册页对-G参数的解释,我认为,因为我也使用-C,文件将以'file< count>'格式保存:

  

-G rotate_seconds   如果指定,则每旋转一次旋转使用-w选项指定的转储文件。 Savefiles将具有-w指定的名称,该名称应包含strftime(3)定义的时间格式。如果未指定时间格式,则每个新文件都将覆盖前一个。   如果与-C选项一起使用,文件名将采用`file< count>'的形式。

如果省略-G选项,则会按预期创建多个文件,但在这种情况下,它们只会根据文件大小而不是时间轮换。

我有什么遗漏可以解释为什么我只得到trace0,而不是其他四个?我的tcpdump版本是4.9.0。

1 个答案:

答案 0 :(得分:0)

  

如果未指定时间格式,则每个新文件都将覆盖前一个。

您必须在文件名的末尾添加%H:%M:%S之类的内容,以防止覆盖发生。要控制文件数量,可以通过挂钩到旋转后命令

来解决

清理脚本:

echo 'ls -tp trace*| tail -n +6 | xargs -I{} sh -c "echo \"Removing {}\"; rm {}"' > cleanup.sh && chmod a+x cleanup.sh

Tcpdump命令

sudo tcpdump -i lo0 -G 1 -W 5 -C 1 -w trace%H:%M:%S -z ./cleanup.sh

示例输出:

tcpdump: listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
Removing trace11:45:580
Removing trace11:45:570
Removing trace11:45:590
Removing trace11:46:000
Removing trace11:46:010

产生的文件

ls -la trace*
-rw-r--r--  1 root  staff   24 Jul  5 11:48 trace11:48:250
-rw-r--r--  1 root  staff  894 Jul  5 11:48 trace11:48:270
-rw-r--r--  1 root  staff  894 Jul  5 11:48 trace11:48:280
-rw-r--r--  1 root  staff  894 Jul  5 11:48 trace11:48:290
-rw-r--r--  1 root  staff  894 Jul  5 11:48 trace11:48:300