如何通过Pyshark调用Tshark editcap按时间范围拆分过滤PCAP文件
1. Python脚本中能否直接调用editcap功能?
editcap是Wireshark套件自带的独立命令行工具,没有提供可供Python直接import的原生SDK接口,但是完全可以在Python脚本中通过子进程方式稳定调用,这也是工业界处理PCAP拆分场景性能最好、最可靠的方案,比纯Python解析实现的速度快5~10倍,且处理GB级大文件时不会出现内存溢出问题。
调用前提是先确认本机已经安装Wireshark,且editcap可执行文件已经加入系统环境变量(如果没加,直接写editcap的绝对路径也可以)。
参考实现代码:
import subprocess from datetime import datetime def split_pcap_by_time_editcap(input_pcap: str, output_pcap: str, start_time: datetime, end_time: datetime): # editcap的-A参数指定起始时间,-B指定结束时间,时间格式要求为"YYYY-MM-DD HH:MM:SS" start_str = start_time.strftime("%Y-%m-%d %H:%M:%S") end_str = end_time.strftime("%Y-%m-%d %H:%M:%S") cmd = [ "editcap", "-A", start_str, "-B", end_str, input_pcap, output_pcap ] # 执行命令,捕获执行错误 result = subprocess.run(cmd, capture_output=True, text=True) if result.returncode != 0: raise RuntimeError(f"editcap执行失败: {result.stderr}") # 调用示例 if __name__ == "__main__": start = datetime(2024, 5, 1, 12, 0, 0) end = datetime(2024, 5, 1, 12, 30, 0) split_pcap_by_time_editcap("source.pcap", "split_12h_12h30.pcap", start, end)
如果需要额外加包过滤规则,可以在调用editcap切分前,先用tshark做一次过滤输出中间文件再切分,或者直接把过滤逻辑集成到tshark命令里,同样通过subprocess调用即可。
2. 不依赖editcap的优雅实现方案
如果你的运行环境没法安装Wireshark套件、不能调用外部命令,可以选择纯Python实现方案,优先选迭代读取、流处理的库,避免把整个PCAP加载进内存:
方案1:Scapy 流处理实现
Scapy是Python生态最成熟的PCAP处理库,PcapReader支持逐包迭代读取大文件,不会占满内存,匹配时间范围的包直接追加写入目标文件即可,参考代码:from scapy.all import PcapReader, wrpcap from datetime import datetime def split_pcap_by_time_scapy(input_pcap: str, output_pcap: str, start_time: datetime, end_time: datetime): matched_pkts = [] with PcapReader(input_pcap) as pcap_reader: for pkt in pcap_reader: # 把包的时间戳转成datetime对象对比 pkt_time = datetime.fromtimestamp(float(pkt.time)) if start_time <= pkt_time <= end_time: matched_pkts.append(pkt) # 每攒1000个包写一次,避免列表占太多内存 if len(matched_pkts) >= 1000: wrpcap(output_pcap, matched_pkts, append=True) matched_pkts.clear() # 把最后剩余的包写入 if matched_pkts: wrpcap(output_pcap, matched_pkts, append=True)这个方案同时支持直接在遍历包的时候加自定义过滤规则,比如按IP、端口、协议类型筛选,灵活度很高,缺点是处理速度比editcap慢,处理10G以上超大PCAP时耗时会明显变长。
方案2:dpkt 高性能实现
如果对处理速度有要求,又不想依赖外部工具,可以用dpkt库,它是纯Python实现的轻量PCAP解析库,解析速度比Scapy快2~3倍,内存占用更低,逻辑和Scapy版本类似,逐包读取、对比时间戳、写入目标文件即可。
注意:你当前在用的Pyshark本身是tshark的封装,只提供PCAP读取、解析能力,没有内置PCAP写入接口,没法单独靠Pyshark完成拆分后文件的导出,必须配合外部工具或者其他支持PCAP写入的库使用。
内容的提问来源于stack exchange,提问作者parmagray

