2016-11-11 95 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

不明白爲什麼我自己沒有想到這個。我沒有測試過,但我相信它會起作用。謝謝! –