我需要不断读取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个读写器进程的例子。它们可以是任何其他程序。另请注意,阅读器进程可以不止一个。实现这一目标的最佳方法是什么?
答案 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
此外,您将在不同的期限窗口中运行此命令