如何在 pcap 文件还在写入的同时连续读取它?

问题描述 投票:0回答:3

我需要连续读取由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 只是 reader 和 writer 进程的两个例子。它们可以是任何其他程序。另请注意,读取器进程可以不止一个。实现该目标的最佳方法是什么?

bash shell file pipeline pcap
3个回答
4
投票

忽略

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 文件格式 有一个标题,你不能像 tail -F 那样从文件末尾开始阅读。您需要从头到尾阅读整个文件,然后开始拖尾。
-n
选项
tail
这样做:

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

1
投票

tcpstat 可以从stdin读取数据: -r 文件名 从文件名中读取所有数据,文件名可以是常规文件、命名管道或“-”以从标准输入读取数据。 所以:

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

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


0
投票

你需要通过“-n+0 -c+1”来增强你的尾部参数。 以下应该做魔术:

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

-n+0 == 从文件的第一行开始读取(加上从开始开始的 0 行偏移量)

-c+1 == 向输出添加一个额外的字节

© www.soinside.com 2019 - 2024. All rights reserved.