使用PyShark LiveCapture带display_filter抓包存PCAP时添加output_file无响应
问题分析
在PyShark 0.6版本中,同时使用LiveCapture的output_file和display_filter参数导致程序无响应的核心原因是:
output_file参数会让tshark将原始数据包写入指定文件,此时tshark默认不再向标准输出(stdout)发送解析后的数据包内容。sniff_continuously()依赖读取tshark输出的PDML格式数据来迭代数据包,没有数据输入就会导致程序卡住。
解决方案
放弃使用output_file参数,改为通过tshark_args手动传递-w参数,让tshark同时完成两个动作:将原始数据包写入PCAP文件,同时输出PDML格式数据供PyShark解析处理。
修改后的代码如下:
import pyshark interf = "Wi-Fi" # 手动添加tshark的-w参数指定输出文件,保留display_filter过滤规则 capture = pyshark.LiveCapture( interface=interf, display_filter='tcp', tshark_args=['-w', 'HERE.pcap'] ) try: for packet in capture.sniff_continuously(): print(packet) except KeyboardInterrupt: print("Capture stopped.")
说明
- 这段代码会持续捕获符合
tcp过滤规则的数据包,实时打印解析后的数据包信息,同时将原始数据包写入HERE.pcap文件。 - 按下
Ctrl+C触发键盘中断时,程序会终止捕获并提示,tshark会自动关闭PCAP文件,保证文件完整性。 - 该实现完全复刻了Wireshark中“实时过滤抓包并可随时停止保存”的功能,无超时和数据包数量限制。
内容的提问来源于stack exchange,提问作者kyrlon
相关产品推荐
相关产品推荐

