首页 > 解决方案 > 如何在不停止的情况下导出 tshark 对象

问题描述

要求: 我需要获取通过我的 wifi 接口下载的任何类型的文件/对象。

我正在运行 tshhark 来监听我的 wifi 接口并使用以下命令将 HTTP 对象导出到给定目录。

 tshark -i wlp4s0 --export-object "http,/tmp/tshark-objects/"

它成功拦截了对象,但不会自动将它们写入指定路径,除非我使用“Ctrl+C”手动停止 tshark。

问题: 如何使用相同的命令/脚本导出通过不同协议下载的任何类型的对象。

约束:

我希望 tshark 连续运行并在通过网络传输对象后立即导出它们。 PS 使用 tshark 对我来说不是强制性的。如果满足此要求,我可以切换到其他工具。

标签: httpnetworkingpacket-capturetshark

解决方案


使用 2 个 tshark 进程

答案是您应该使用不同的 tshark 进程编写和导出。这可以通过在条件上创建新文件来通过文件轮换来完成。您可以使用几个不同的选项:

 -b <ringbuffer opt.> ..., --ring-buffer <ringbuffer opt.>
                           duration:NUM - switch to next file after NUM secs
                           filesize:NUM - switch to next file after NUM KB
                              files:NUM - ringbuffer: replace after NUM files
                            packets:NUM - switch to next file after NUM packets
                           interval:NUM - switch to next file when the time is
                                          an exact multiple of NUM secs

例如,要每分钟旋转一次,请使用

$ tshark -b duration:60 -w output.pcap

要在新文件出现时从新文件中导出对象,您需要观察文件系统中的新文件。您可以在 linux 上使用 inotify,在 osx 上使用 fswatch,或在其他平台上使用类似的实用程序。

将新文件发送到 tshark 进行导出

在这里,每个新文件都会触发 tshark 文件导出。两者都使用-Q以防止 tshark 打印每个传入的截断文件中的数据包。

fswatch (Mac)

$ tshark -b duration:60 -w output.pcap
$ fswatch . | while read f
do tshark -r $f -Q --export-object "http,/tmp/tshark-objects/"
done

inotifywait (Linux)

$ tshark -b duration:60 -w output.pcap
$ inotifywait . -m -e "CLOSE" --format "%f" | while read f
do tshark -r $f -Q --export-object "http,/tmp/tshark-objects/"
done

推荐阅读