使用 tshark 递归过滤 .cap/.pcap 文件目录

Recursively Filter directory of .cap/.pcap Files With tshark

我正在尝试将 Wireshark 过滤器应用于 tcpdump 创建的 .cap 个文件的目录。我有大约 1000 个 .cap 文件等待过滤(我们有意在不使用过滤器的情况下进行捕获,以确保我们拥有所需的所有数据,以防我们的假设不成立)。我找不到任何关于使用 tshark 递归读取文件、应用过滤器、写出新的 .cap 文件,然后继续下一个、冲洗、重复的人的参考资料。

我的设置:

Tcpdump 正在转储流量并在文件达到 1GB 后滚动到新文件(是的,对于 pcaps 来说很大)。仅供参考,这是我正在使用的 tcpdump 命令:

sudo tcpdump -q -i <INTERFACE> -w path/to/capfile.cap -C 1000 -Z root

我可以使用 tshark 将过滤器应用于给定的 .cap 文件,并使用以下命令将其输出到新的 .cap 文件没问题:

tshark -R <FILTER> -r in.cap0001 -w out.cap0001

Tshark 主页状态,

"-r ...It is possible to use named pipes or stdin (-) here..."

但我绝不是名为pipesstdin的专家,也不是程序员。

有人能给我指出正确的方向吗?谢谢!

我认为您可以直接使用一些 shell 命令来实现。

尝试以下操作,转到您捕获的目录并执行以下命令:

ls | grep '\.cap$' | while read f; do (tshark -R <FILTER> -r $f -w mod_$f); done

这将生成应用了所需过滤器的新 .cap 文件。不用说,可以适当调整此命令以满足您的个人需求,但这是一个不错的起点。


命令解释:

ls: 列出当前目录包含的所有文件。

|:管道,左侧命令的标准输出作为右侧命令的标准输入。

grep '\.cap$':确保您只处理以 .cap 结尾的文件。根据您的评论,请注意,如果文件未完全以 .cap 结尾,则应将此过滤器更改为 grep '\.cap',因为 $ 告诉 grep该行以其前面的内容结尾(在本例中为 ".cap" 字符串).

while read f: 读取前面命令返回的每一行。

do (<COMMAND>):对于读取的每一行,它 do 是命令,在本例中是您的 tshark 命令。

donewhile命令语法的一部分。


示例命令执行:

# ls
fake.cap2  non_cap_file.txt  out2.cap  out.cap

# ls | grep '\.cap$'
out2.cap
out.cap

以下是您实际需要执行的唯一一行,其他行在这里只是为了说明命令执行前后的文件夹内容。

# ls | grep '\.cap$' | while read f; do (tshark -R <FILTER> -r $f -w mod_$f); done
Running as user "root" and group "root". This could be dangerous.
Running as user "root" and group "root". This could be dangerous.

附带说明一下,我收到此 root 警告是因为我使用 root 用户进行了此快速测试...

# ls
fake.cap2  mod_out2.cap  mod_out.cap  non_cap_file.txt  out2.cap  out.cap

# ls | grep '\.cap$'
mod_out2.cap
mod_out.cap
out2.cap
out.cap

如您所见,它抓取每个 .cap 文件,应用指定的过滤器并写入一个新的 mod_*.cap 文件。