tcpdump 多个 pcap 带 xargs

tcpdump 多个 pcap 带 xargs

我正在尝试将多个 pcap 发送到 xargs 循环中,以便将它们 tcpdump 到单个文件中。这些是来自 Bro's Timemachine 的 1GB PCAP 文件。

网上有一些例子,但我唯一能做的就是在处理它们之前对它们进行合并,这是非常消耗处理器资源的。

我试过...

ls class_all_1447887* | xargs -t -I file tcpdump -nnr file -w ~/test.cap "src 127.1.0.1"

...但它会为每个循环重新创建 test.cap,而不是按顺序添加。

有没有一种方法可以做到这一点,而无需先创建 15GB 文件来划分会话?

答案1

不必tcpdump每次都创建一个新文件,而是tcpdump写入标准输出并将整个命令的输出重定向到~/test.cap.

像这样:

ls class_all_1447887* |
xargs -t -I file tcpdump -nnr file "src 127.1.0.1" > ~/test.cap

或者您可以为每个输入文件编写不同的文件:

mkdir ~/test.cap.d
ls class_all_1447887* |
xargs -t -I file tcpdump -nnr file -w ~/test.cap.d/file.tcpd "src 127.1.0.1"

我不熟悉 NetMiner 和 Wireshark 的输入要求,也不熟悉的输出tcpdump

答案2

我正在尝试将多个 pcap 发送到 xargs 循环中,以便将它们 tcpdump 到单个文件中。

Tcpdump 不支持合并 pcap 文件。

mergecap 可以,但如果你不想使用它,因为它占用太多 CPU,并且如果

  1. 所有文件都具有相同的链路层标头类型(例如以太网)和相同的快照长度;
  2. 您只想连接文件,因为对于所有 N 值,第 N+1 个文件的数据包全部位于第 N 个文件中的数据包之后;

您需要尝试与您找到的文章的“标头操作示例”部分中的解决方案类似的解决方案。该示例意味着您必须以不同于所有其他文件的方式对待连接的第一个文件,因为您将从所有其他文件中剥离文件头,但是不是第一个文件。

这是一个应该执行此操作的脚本:

#! /bin/sh
first_file=yes
for i in class_all_1447887*
do
    if [ "$first_file" = "no" ]
    then
        #
        # Strip off file header from tcpdump's output.
        #
        tcpdump -r "$i" -w - "src 127.1.0.1" | \
            (dd of=/dev/null bs=24 count=1; cat)
    else
        tcpdump -r "$i" -w - "src 127.1.0.1"
        first_file=no
    fi
done > test.cap

相关内容