博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python3+pyshark捕获数据包并保存为文件
阅读量:6889 次
发布时间:2019-06-27

本文共 1926 字,大约阅读时间需要 6 分钟。

一、直接使用wireshark捕获数据包并保存为文件

可以使用wireshark通过图形界面的操作来实现捕获数据包并保存为文件。

wireshark默认捕获的数据包保存为临时文件,如果最后退出时不选择保存那么临时文件将会被删除。

可以在“菜单栏----捕获----选项----输出”窗口进行配置,指示wireshark直接将捕获结果保存为文件。

文件----数据包要保存到的文件

输出格式----数据包保存成的文件的文件格式

自动创建新文件----指示当当前文件达到某个指标后,就把后续数据包另存到另一个文件。(本质是通过关闭当前监听新启一个监听来实现)

使用一个环形缓冲器----只保存为那么多个文件,数量用完后从头形始覆盖。

以如上配置为例,截获结果如下:

 

 二、使用tshark捕获数据包并保存为文件

tshark就是命令行版的wireshark(基于wireshark的多种表示,感觉wireshark部份功能也是调用tshark来实现的),所以也可以通过tshark来实现同样的效果。

使用-i指定网卡,使用-w实现文件,使用-F实现指定格式,使用-b实现自动创建新文件。

-i使用的网卡名,控制面版中看到的是什么就是什么,wireshark列出来的是什么就是什么。

Linux版形如:

tshark -i eth0 -b filesize:1024 -F pcap -w test_pcap.pcap

Windows版形如:

tshark -i "本地连接 2" -b filesize:1024 -F pcap -w test_pcap.pcap

 

三、使用pyshark捕获数据包并保存为文件

3.1 直接无法捕获数据包

pyshark本质是调用tshark,理论上捕获代码应形如下:

import pysharktshark_path = 'D:\\tools\\Wireshark\\tshark.exe'capture = pyshark.LiveCapture(output_file="test_pcap.pcap",interface="本地连接 2",tshark_path=tshark_path)capture.sniff(timeout=10)

但是在python-3.6.6环境中无论是Linux还是Windows都捕获不到数据包(<LiveCapture (0 packets)>)

追踪代码看到在没指定网卡时pyshark是通过tshark -D来列出所有网卡,然后取网卡前序号形式来指定网卡

由上图可以看到“本地连接 2”序号为6,但代码改为形如下仍不能捕获到数据包

(其实使用网卡名和网卡序号两种方式tshark都是支持的,所以和这个无关;当然也不能算一定关系没有,传给pyshark的”本地连接 2“参数中间有空格,pyshark再传给tshark时不会自动加上引号tshark会因格式不对启不来,但这里也不是因为这个。)

import pysharktshark_path = 'D:\\tools\\Wireshark\\tshark.exe'capture = pyshark.LiveCapture(output_file="test_pcap.pcap",interface="6",tshark_path=tshark_path)capture.sniff(timeout=10)

 后来看网上也有,说是版本问题(我当前是0.4.1也一样的问题)而0.3.6.2版本是可以的,使用python2.7+0.3.6.2版本(pip install pyshark==0.3.6.2)确实可以成功保存数据包。

 

3.2 修改live_capture.py实现捕获数据包并保存为文件

pyshark-0.3.6.2在python-3.6装不上,要去用python2.7这是令人不爽的。

通过capture.set_debug()开启打印debug信息可以看到是tshark报错:tshark: You can't write both raw packet data and dissected packets to the standard output.排查之下发现是tshark的"-P"(打印汇总信息)和”-w -“(将原始数据包输出到控制台)冲突所致。

简单分析pyshark流程发现去除”-P“参数可解决捕获不到数据包的问题。操作如下:

 打开pyshark的live_capture.py移动到72行,将原先的params = ["-q", "-P"]修改为params = ["-q"]

 

参考:

转载地址:http://nrqbl.baihongyu.com/

你可能感兴趣的文章
一、 Python的基本概念
查看>>
子元素margin影响父元素的问题
查看>>
MUI功能列表
查看>>
为什么沃尔玛和其他大型零售商正联手创建移动支付?
查看>>
ios注册通知NSNotificationCenter(一)
查看>>
poj 3252 Round Numbers (组合数)
查看>>
求两个长度相等的排序数组的上中位数
查看>>
video 全屏时 隐藏controls
查看>>
利用腾讯云为你的域名申请并配置免费SSL一年
查看>>
【转】asp.net 利用Global.asax 捕获整个解决方案中的异常错误
查看>>
一道算法题-换钱
查看>>
Python私有属性set 和get方法
查看>>
最短路算法详解
查看>>
YII2中操作数据库的方式
查看>>
python input() 与raw_input()
查看>>
mysql数据库 --表查询
查看>>
Python中xlrd常用用法整理
查看>>
文档管理系统介绍
查看>>
Python调用函数带括号和不带括号的区别
查看>>
如何上传本地音乐获取MP3外链(欢迎分享和转载)
查看>>