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


14

我希望能够捕获旋转的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

请看我的答案
MariusMatutiae

Answers:


13

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

该选项-G表示:

-G rotate_seconds

      如果指定,则-w每隔turn_seconds秒旋转一次用选项指定的转储文件。保存文件将具有指定的名称,-w该名称应包含strftime(3)定义的时间格式。如果未指定时间格式,则每个新文件都将覆盖前一个文件。

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

自从您写完-G 3,您将每3秒旋转一次,

...可捕获30分钟的数据

同样,命名方案是错误的:从上面来看,

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

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

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

tcpdump的[  -AdDefIKlLnNOpqRStuUvxX  ] [  -B  BUFFER_SIZE  ] [  -c  计数  ]
-C  FILE_SIZE  ] [  -G  rotate_seconds  ] [  -F  文件  ] [  -I  接口  ] [  -m  模块  ] [  -M  秘密  ] [  -r  文件  ] [  -s  snaplen  ] [  -T  类型  ] [  -w  文件  ] [  -W  filecount  ] [  -E  spi @ ipaddr algo:secret,... ] [  -y  datalinktype  ] [  -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

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


最终答案缺少条件If no time format is specified, each new file will overwrite the previous.(我已经更新了答案。)
okwap

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

@BillMenees感谢您将要对我的关注,我有撤消 OKWAP的编辑。
MariusMatutiae

就像下面评论中的Swinster一样,我注意到此答案不会产生预期的行为。结合使用-w -W -C和-G会导致同一文件一次又一次地被覆盖。它并不会导致创建多个文件等于-W <N>正如人们所期望。
Niels2000

6

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

tcpdump -i en0 -w /var/tmp/trace-%m-%d-%H-%M-%S-%s -W 3 -G 300

会给你%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

对于组织那些讨厌的间歇性问题的跟踪非常有用。另外,如果您不是root用户,则可能需sudo要这样做,当然也可以使其成为nohup:

sudo bash -c "nohup tcpdump -i en0 -w /var/tmp/trace-%m-%d-%H-%M-%S-%s -W 3 -G 300 &"

3

在我看来,您所需要的只是

tcpdump -i en0 -G 1800 -w /var/tmp/trace-%H-%M.pcap

-G在-w文件名中期望的strftime格式说明符不必代表完整的日期和时间。仅存在%H和%M,并且旋转时间恰好为半小时,任何给定的tcpdump调用都只会相隔半小时生成两个不同的%M值,而昨天的跟踪文件将在同一小时被覆盖分钟数再次滚动。


1

经过一些试验,我无法按预期得到@MariusMatutiae答复。如果时间成为限制因素,并且未在文件名中添加时间格式,则仅覆盖当前的pcap文件。

例如,尝试:

tcpdump -i en0 -w /var/tmp/trace -W 10 -G 5 -C 1

您最终所要做的就是trace.pcap0一遍又一遍地写。

正如注释中所建议的那样,如果将时间格式添加到文件名中,那么您最终只会得到文件的每一个增长列表。

因此,我不得不坚持简单的大小限制文件:

tcpdump -i en0 -w /var/tmp/trace -W 48 -C 100

0

是的,这似乎不如MariusMatutiae的回答所说。

tcpdump ...{other options}... -w httpdebug.pcap -W 48 -G 1800 -C 100
$ ls -l
-rw-r--r--. 1 tcpdump tcpdump  100007441 Mar 17 17:57 httpdebug.pcap00
-rw-r--r--. 1 tcpdump tcpdump   46895104 Mar 17 18:02 httpdebug.pcap01
-rw-r--r--. 1 tcpdump tcpdump   93091143 Mar 17 17:47 httpdebug.pcap02
-rw-r--r--. 1 tcpdump tcpdump    5372072 Mar 17 16:17 httpdebug.pcap03

在我看来,它可能-C 100在30分钟内捕获尽可能多的MB文件,因为它httpdebug.pcap03具有最早的时间戳,并且比100MB小得多,因此看起来好像是在30分钟处被剪切了。一旦达到30分钟,它就会跳回httpdebug.pcap00并增加数字,达到100MB。这意味着,如果您在30分钟内有很多请求,则会获得很高的httpdebug.pcapXX数字。如果您再也无法在一段时间内收到这么多请求,那么那些高httpdebug.pcapXX数字将永远不会被覆盖。

所以我在考虑每个时间片的周期性文件意味着时间片是-G 1800,并且它将每个循环一次-G 1800并递增-C 100

我不确定是否-W 48会影响它,但是也许您可以达到httpdebug.pcap47(计数从0开始,它将停止捕获数据包。


最近,GitHub出现了一个有关措辞混乱的问题。他们没有更改实现,但是他们试图使文档更加清晰。

提议的变更对合并2019年1月28日

截至2019年3月17日,这是当前文档:

-C

.BI \-C " file_size"
Before writing a raw packet to a savefile, check whether the file is
currently larger than \fIfile_size\fP and, if so, close the current
savefile and open a new one.  Savefiles after the first savefile will
have the name specified with the
.B \-w
flag, with a number after it, starting at 1 and continuing upward.
The units of \fIfile_size\fP are millions of bytes (1,000,000 bytes,
not 1,048,576 bytes).

-G

.BI \-G " rotate_seconds"
If specified, rotates the dump file specified with the
.B \-w
option every \fIrotate_seconds\fP seconds.
Savefiles will have the name specified by
.B \-w
which should include a time format as defined by
.BR strftime (3).
If no time format is specified, each new file will overwrite the previous.
Whenever a generated filename is not unique, tcpdump will overwrite the
preexisting data; providing a time specification that is coarser than the
capture period is therefore not advised.
.IP
If used in conjunction with the
.B \-C
option, filenames will take the form of `\fIfile\fP<count>'.

-W

.B \-W
Used in conjunction with the
.B \-C
option, this will limit the number
of files created to the specified number, and begin overwriting files
from the beginning, thus creating a 'rotating' buffer.
In addition, it will name
the files with enough leading 0s to support the maximum number of
files, allowing them to sort correctly.
.IP
Used in conjunction with the
.B \-G
option, this will limit the number of rotated dump files that get
created, exiting with status 0 when reaching the limit.
.IP
If used in conjunction with both
.B \-C
and
.B \-G,
the
.B \-W
option will currently be ignored, and will only affect the file name.

我仍然认为这有点令人困惑,但是我想与我上面的结论有所不同,它表示-W与一起使用时-C -G除了文件名外不影响其他任何内容。

通常,-W用于限制文件数。因此,如果要无限期捕获,请不要使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.