2016-11-11 93 views
5

我有pcap文件不断生成给我。它想不断地将它们喂给一个“永不停息”的tshark/wireshark。以下是我已经试过(OSX)连续向pcshark/wireshark提供pcap文件

mkfifo tsharkin 
tail -f -c +0 tsharkin | tshark -l -i - > tsharkout 2>stderr & 
cat file1.pcap > tsharkin 

在tsharkout

cat file2.pcap > tsharkin 

以上来自file1.pcap以上正常工作,我得到预期输出的不工作,我什么也没得到在tsharkout,但我得到在标准错误“1包丢弃” +“捕获三包”

cat file2.pcap > tsharkin 

再次尝试使尾/ 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 

这工作得很好,我得到预期输出来自file1.pcap和file2 tsharkout中的.pcap

问题在于我的pcap文件一路走来,所以我不能在喂入tshark之​​前合并它们。我需要能够在它们到达时将pcap文件提供给“永远运行”的tshark。我怎样才能做到这一点?

+0

为什么不把这段代码包装在一个节点服务器中,并且每次接收到一个文件时都产生一个新的tshark。 高级算法, - 在新生成的管道中接收pcap。 (可能将它命名为时间戳) - 使节点应用程序轮询目录以检查新创建的命名管道。 - 一旦收到命名管道上的pcap,产生一个运行tshark的子进程。 - 将结果写入通用目录。 – Himanshu97

+0

@ Himanshu97它不会这样做。两个连续的pcap文件可能包含属于同一个会话的数据。例如。一个html文档通过几个ip数据包在线上传输。这些ip数据包的前半部分可以在file1.pcap中,而这些ip数据包的后半部分可以在file2.pcap中。我想要重建html文档,并且只有在file1.pcap和file2.pcap馈入同一个tshark实例时才会发生。 –

+0

在这种情况下,您可以简单地将文件传输到您的unix管道中,如下所示: “cat ”| tsharkin“ 并使tshark始终从管道中读取。 所以会发生什么,你会将你的文件内容追加到管道中。 和命名管道作为FIFO,所以它应该工作。 – Himanshu97

回答

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),时区和数据包的最大捕获长度。

+0

不明白为什么我自己没有想到这个。我没有测试过,但我相信它会起作用。谢谢! –