如何在无GUI环境下用PyShark捕获Some IP流量?
无UI环境下解析PCAP中的Some IP数据包
问题背景
- 本地带Wireshark GUI的环境中,PyShark脚本可正常提取Some IP数据包
- 无UI的远程服务器(TShark/Wireshark、PyShark版本与本地一致),直接使用
cap = pyshark.FileCapture(file, display_filter=filter)无法捕获Some IP包 - 指定固定UDP端口的
decode_as参数能生效,但Some IP流量的端口不固定 - 遍历所有UDP端口再批量解码的临时方案耗时过长
解决方案
1. 修改Wireshark全局配置,自动识别所有端口的Some IP流量
无UI环境下可通过修改Wireshark配置文件,让TShark默认根据协议头识别Some IP包,无需指定端口:
- 找到TShark配置目录:
- Linux:
~/.wireshark/ - Windows:
%APPDATA%\Wireshark\
- Linux:
- 编辑
preferences文件,添加或更新以下配置项:someip.deserialize_unknown_messages: TRUE someip.port: 0someip.port: 0表示不限制端口,解析器会自动识别符合Some IP协议头特征的UDP包 - 保存配置后,直接使用原代码
cap = pyshark.FileCapture(file, display_filter=filter)即可自动捕获所有端口的Some IP流量
2. 给PyShark传递TShark临时参数(不修改全局配置)
如果不想改动全局配置,可在初始化FileCapture时,通过tshark_args传递临时配置参数:
cap = pyshark.FileCapture( file, display_filter=filter, tshark_args=[ "-o", "someip.port:0", "-o", "someip.deserialize_unknown_messages:TRUE" ] )
该方式仅对当前PCAP解析生效,不会影响全局配置
3. 优化UDP端口遍历方法(兼容旧版本场景)
若前两种方法不适用,可改用TShark命令行直接提取UDP端口,大幅提升速度:
import subprocess def get_someip_ports_fast(pcap_file): # 调用tshark直接提取所有UDP端口,避免PyShark全量解析包 result = subprocess.run( [ "tshark", "-r", pcap_file, "-T", "fields", "-e", "udp.srcport", "-e", "udp.dstport", "-Y", "udp" ], capture_output=True, text=True ) ports = set() for line in result.stdout.splitlines(): if line: src_port, dst_port = line.split() ports.add(src_port) ports.add(dst_port) return list(ports) # 获取所有UDP端口后批量解码 someip_ports = get_someip_ports_fast(file) decode_map = {f'udp.port=={port}': 'someip' for port in someip_ports} cap = pyshark.FileCapture(file, display_filter=filter, decode_as=decode_map)
内容的提问来源于stack exchange,提问作者Curious koala
相关产品推荐
相关产品推荐

