我有连续生成的pcap文件给我。它希望不断地将它们送到一个“不断运行”的状态。 tshark的/ Wireshark的。这是我尝试过的(OSX)
mkfifo tsharkin
tail -f -c +0 tsharkin | tshark -l -i - > tsharkout 2>stderr &
cat file1.pcap > tsharkin
以上工作正常,我从tsharkout
中的file1.pcap得到预期的输出cat file2.pcap > tsharkin
以上不起作用,我在tsharkout中什么都没得到,但是我得到了#1; 1个丢包" +"捕获3个数据包"在stderr
cat file2.pcap > tsharkin
再次尝试使tail / tshark进程停止/崩溃
我尝试再次尝试,但这次首先使用file2.pcap,然后使用file1.pcap。这次file2.pcap处理得很好,file1.pcap使tail / tshark进程停止/崩溃。因此,我将得出结论,两个pcap文件没有任何问题,但似乎tshark不喜欢抛出多个pcap文件。
为了测试它,我尝试首先使用mergecap合并file1.pcap和file2.pcap,并将其提供给tshark
mergecap -F pcap -w file1_2.pcap file1.pcap file2.pcap
cat file1_2.pcap > tsharkin
这很好用,我在tsharkout中得到了file1.pcap和file2.pcap的预期输出
问题是我的pcap文件一路走来,所以我不能在将它们全部合并到tshark之前。我需要能够在他们到达时提供pcap文件,以及#34;永远运行的" tshark的。我怎样才能做到这一点?
答案 0 :(得分:1)
TL; DR。 libpcap文件有a header。您需要为第二个和后续捕获文件删除它:
cat file2.pcap | tail -c +25 > tsharkin
我的输出,在tshark中输入两次相同的文件时:
1 0.000000 10.0.0.1 → 10.0.0.2 TLSv1.2 246 Application Data
2 0.058816 10.0.0.2 → 10.0.0.1 TCP 66 443 → 58616 [ACK] Seq=1 Ack=181 Win=1701 Len=0 TSval=3578216450 TSecr=5878499
3 0.000000 10.0.0.1 → 10.0.0.2 TLSv1.2 246 [TCP Spurious Retransmission] , Application Data
4 0.058816 10.0.0.2 → 10.0.0.1 TCP 66 443 → 58616 [ACK] Seq=1 Ack=181 Win=1701 Len=0 TSval=3578216450 TSecr=5878499
<强>详情
如the documentation for the libpcap format中所述,libpcap文件有 24字节全局标题 。这个全局标头后面紧跟着包(their own libpcap header)而没有填充。
因此,在将libpcap文件提供给tshark时,第一个文件正常工作,因为tshark期待一个全局头。但是,它并不期望您提供它的后续文件。这可能导致tshark看到第二个文件的开头(实际上是一个全局标题,再次)作为格式错误的数据包并丢弃它(“丢弃1个数据包”)。我不知道为什么tshark会停止使用第三个文件。
如果您确定所有捕获文件都具有相同格式(谨防pcapng文件)和相同标题,则可以安全地删除全局在将它们发送到命名管道之前,第二个文件(以及后续文件)的标头。一种方法是使用您在问题中使用的尾部语法:
tail -c +startoffset file
全局标头长度为24个字节,我们希望在第25个字节开始读取捕获文件。
请注意相同的标题。如果以相同的方式检索所有捕获文件,它们可能具有相同的全局标头。特别地,物理层协议(例如,以太网)需要是相同的。该全局标头还包含格式的版本(例如,2.4
),时区和数据包的最大捕获长度。