2016-12-05 55 views
2

我需要不斷閱讀pcap捕獲程序記錄的pcap文件。如何在正在寫入的同時繼續讀取pcap文件?

tcpdump -i eth0 -w foo.pcap 
tcpstat -r foo.pcap -o "pps: %p\n" 1 

對於一個例子,假設我記錄由上述tcpdump命令一個PCAP和試圖與tcpstat閱讀。這裏,tcpstat正在執行當前的foo.pcap並完成它的工作。我想要的是讓它等待新的軟件包並處理它們。你可以認爲它是一個tailf命令,但是讀取pcap而不是文本文件。

請注意,這裏的tcpdump和tcpstat只有2個讀寫器進程的例子。他們可以是其他任何程序。另請注意,讀者流程可以不止一個。什麼是最好的方式來實現這一目標?

回答

2

忽略pcap東西(看帖子的末尾)開始,並回答一般問題:

...這裏tcpdump和tcpstat只有2讀寫器工藝的例子。他們可以是其他任何程序。另請注意,讀者流程可以不止一個。什麼是最好的方式來實現這一目標?

所以一個作家多讀者問題。

什麼是Bash最好的解決方案?可能tail -F my.log文件。例如:

while true; do echo ${RANDOM} >> my.log; sleep 1; done & 
tail -F my.log & 
tail -F my.log & 
tail -F my.log & 

還有tee但寫入多個文件不是多個進程。我想你可以設置一堆管道來處理和使用三通。

注有很多更好的解決方案Bash中不,你可能想,如果你想有一個更高質量的解決方案中使用的。 tail和UNIX管道的一個普遍問題是它們是以流爲導向的,並且您可能需要一個面向消息的流。 UNIX消息隊列,隊列服務器或者socket可以幫助解決這個問題。


pcap情況

tail -F不會起作用,因爲pcap file format有一個頭,你不能只是開始從一樣的尾巴-F確實該文件的末尾讀取。您需要從頭開始讀取整個文件,然後開始拖尾。 -n選項tail做的是:

tail -n+0 -F foo.pcap | tcpstat -r- -o "pps: %p\n" 
+0

你無視我的問題的最重要的部分! – ibrahim

+0

@ibrahim查看更新的答案。 'tail's' -n選項可以做到這一點。 – spinkus

+0

這樣做。謝謝。 – ibrahim

0

tcpstat可以讀取標準輸入數據: 閱讀從文件名的所有數據-r文件名 ,這可能是一個普通的文件,命名管道或「 - 」來讀它的數據來自標準輸入。 所以:

​​

此外,您可以運行此命令在不同termial窗口

+0

我已經試過了。 tcpstat返回該錯誤。pcap_open():未知的文件格式 – ibrahim