shell 如何连续读取pcap文件,同时还在写?

uinbv5nw  于 2023-04-21  发布在  Shell
关注(0)|答案(3)|浏览(176)

我需要连续读取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个读取器和写入器进程的示例。它们可以是任何其他程序。还要注意,读取器进程可以不止一个。实现这一点的最佳方法是什么?

kkih6yb8

kkih6yb81#

忽略pcap的东西(见文章结尾)开始,并回答一般问题:
...这里tcpdump和tcpstat只是两个读取器和写入器进程的例子。它们可以是任何其他程序。还要注意,读取器进程可以不止一个。实现这一点的最佳方法是什么?
一个作者多个读者的问题。

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中有很多更好的解决方案 * 不是 *,你可能想使用它们。tail和UNIX管道的一个普遍问题是它们是面向流的,你可能想要一个面向消息的流。UNIX消息队列,队列服务器,或者套接字可以帮助你。

pcap案例

tail -F不起作用,因为pcap file format有一个头,你不能像tail -F那样从文件的结尾开始阅读。你需要从头到尾读取整个文件,然后开始拖尾。tail-n选项可以做到这一点:

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

dy1byipe2#

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

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

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

62lalag4

62lalag43#

你需要通过“-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 ==在输出中添加额外的字节

相关问题