如何连续读取pcap文件仍在写入?

时间:2016-12-05 10:42:43

标签: bash shell file pipeline 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 个答案:

答案 0 :(得分: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但是写入多个文件而不是多个进程。我想你可以设置一堆管道来处理和使用tee。

请注意,如果您需要更高质量的解决方案,那么您可能希望使用Bash中有许多更好的解决方案 not tail和UNIX管道的一个普遍问题是它们是面向流的,您可能需要一个面向消息的流。 UNIX消息队列,队列服务器或套接字可以帮助解决这个问题。

pcap案例

tail -F无法正常工作,因为pcap file format有一个标题,您无法从文件末尾开始读取,就像tail -F那样。您需要从头到尾阅读整个文件,然后开始拖尾。 -n的{​​{1}}选项可以做到:

tail

答案 1 :(得分:0)

tcpstat可以从stdin读取数据: -r filename 从文件名中读取所有数据,这些数据可能是常规文件,命名管道或" - "从标准输入读取它的数据。 所以:

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

此外,您将在不同的期限窗口中运行此命令