tcpdump – 使用 -G、-W 和 -C 旋转捕获文件

And*_*rew 19 linux unix tcpdump macos

我希望能够捕获循环的 tcpdump 输出,该输出将 30 分钟的数据捕获到 48 个文件中,循环。

手册页暗示这应该是可能的,但我的测试似乎没有产生我正在寻找的结果:

-W

      与该-C选项结合使用,这会将创建的文件数量限制为指定数量,并从头开始覆盖文件,从而创建一个“旋转”缓冲区。此外,它会以足够多的前导 0 来命名文件以支持最大数量的文件,从而使它们能够正确排序。

      -G选项结合使用,这将限制创建的旋转转储文件的数量,达到限制时以状态 0 退出。如果同时使用-C,该行为将导致每个时间片的循环文件。

我在 OS X 10.9.5/10.10.3 客户端上运行它。这是测试命令;它只是在第三个文件之后退出:

tcpdump -i en0 -w /var/tmp/trace-%Y-%M-%d_%H.%M.%S.pcap -W 3 -G 3 -C -K -n
Run Code Online (Sandbox Code Playgroud)

Mar*_*iae 19

那是因为你写的-W 3不是-W 48. 但是,您的命令中还有其他错误。

该选项-G意味着:

-G rotate_seconds

      如果指定,则-w每隔rotate_seconds轮换使用选项指定的转储文件。保存文件将具有指定的名称,-w该名称应包含由 strftime(3) 定义的时间格式。如果没有指定时间格式,每个新文件都会覆盖之前的文件。

      如果与该-C选项结合使用,文件名将采用“ file <count>”的形式。

既然你写了-G 3,你将每 3 秒旋转一次,而你说

...捕获 30 分钟的数据

此外,命名方案是错误的:从上面,

如果与该-C选项结合使用,文件名将采用“ file <count>”的形式。

因此没有必要为名称指定时间格式。

此外,该-C选项没有参数,而根据手册页,它应该:

tcpdump [  -AdDefIKlLnNOpqRStuUvxX  ] [  -B  buffer_size  ] [  -c  count  ]
-C  file_size  ] [  -G  rotate_seconds  ] [  -F  file  ] [  -I  interface  ] [  -m  module  ] [  -M  secret  ] [  -r  file  ] [  -s  snaplen  ] [  -T  type  ] [  -w  file  ] [  -W  filecount  ] [  -E  spi@ipaddr algo:secret,... ] [  -y 数据链接类型 ] [  -z  postrotate-command  ] [  -Z 用户 ] [ 表达式 ]

手册页指出:

-C

      在将原始数据包写入保存文件之前,请检查文件当前是否大于file_size,如果是,请关闭当前保存文件并打开一个新文件。第一个保存文件之后的保存文件将具有由-w标志指定的名称,其后带有一个数字,从 1 开始并继续向上。file_size的单位是百万字节(1,000,000 字节,而不是 1,048,576 字节)。

因此,您应该指定-C 100以生成 100?MB 的文件。

最后,您的命令应该是:

tcpdump -i en0 -w /var/tmp/trace -W 48 -G 1800 -C 100 -K -n
Run Code Online (Sandbox Code Playgroud)

这将循环旋转文件(名称为 trace1、trace2、...),周期为 48,每 1800 秒(=30 分钟)或每 100?MB,以先到者为准。

  • @okwap,当您编辑答案(添加 -%Y-%m-%d_%H:%M:%S)时,您打破了将 -G、-C 和 -W 一起使用的循环部分。仅使用 /var/tmp/trace 作为 -w 文件名的原始答案是正确的,并生成了所描述的预期循环输出(trace1、trace2...)。当 -G、-C 和 -W 一起使用时,您不能在文件名中使用 strftime 格式并仍然获得循环输出。通过您的编辑,tcpdump 将继续非循环地写出文件,因为文件名永远不会重复。 (2认同)

小智 7

扩展flabdablet 的答案 (更改-G 1800-G 300– 每五分钟轮换一次 – 仅用于测试目的),

tcpdump -i en0 -w /var/tmp/trace-%m-%d-%H-%M-%S-%s -W 3 -G 300
Run Code Online (Sandbox Code Playgroud)

会给你%m=month, %d=day of month, %H=hour of day, %M=minute of day, %S=second of day, %s=millisecond of day, 导致

/var/temp/trace-03-02-08-30-56-1520002568
/var/temp/trace-03-02-08-35-56-1520002568
/var/temp/trace-03-02-08-40-56-1520002568
Run Code Online (Sandbox Code Playgroud)

对于为那些讨厌的间歇性问题组织跟踪非常有用。另外,如果你不是 root,你可能想要sudo并且当然使它成为一个 nohup:

sudo bash -c "nohup tcpdump -i en0 -w /var/tmp/trace-%m-%d-%H-%M-%S-%s -W 3 -G 300 &"
Run Code Online (Sandbox Code Playgroud)