我正在运行以下测试脚本,尝试从我下载的示例.pcap
文件中读取数据包。它似乎无法运行。我有所有模块,但似乎没有运行示例。
import socket
import dpkt
import sys
pcapReader = dpkt.pcap.Reader(file("test1.pcap", "rb"))
for ts, data in pcapReader:
ether = dpkt.ethernet.Ethernet(data)
if ether.type != dpkt.ethernet.ETH_TYPE_IP: raise
ip = ether.data
src = socket.inet_ntoa(ip.src)
dst = socket.inet_ntoa(ip.dst)
print "%s -> %s" % (src, dst)
由于某种原因,这没有被正确解释。运行时,我得到了
KeyError: 138
module body in test.py at line 4
function __init__ in pcap.py at line 105
Program exited.
这是为什么?怎么了?我的安装有问题吗?我在mac上使用Python 2.6
答案 0 :(得分:1)
待办事项
pcapReader = dpkt.pcap.Reader(open('test1.pcap'))
而不是:
pcapReader = dpkt.pcap.Reader(file("test1.pcap", "rb"))
答案 1 :(得分:1)
dpkt.pcap模块的第105行使用pcap文件的链接类型来访问链接类型映射的字典:
self.dloff = dltoff[self.__fh.linktype]
dltoff字典在模块的顶部定义,它不包含密钥138,因此您看到了异常。 根据{{3}},值为138是LINKTYPE_APPLE_IP_OVER_IEEE1394的链接类型。如果这不是您期望的链接类型,那么pacp文件可能已损坏。否则,您可以尝试更新dltoff字典并为138添加条目。根据其tcpdump's link types page,其标头长度为18个字节。因此,在dkpt / pcap.py第40行之后添加以下说明应该有效:
LINKTYPE_APPLE_IP_OVER_IEEE1394 = 138
dltoff[LINKTYPE_APPLE_IP_OVER_IEEE1394 ] = 18
答案 2 :(得分:-1)
嗯,你似乎缺乏帮助......我不知道膝盖上的pcap,所以我所能做的就是尽力帮助你自己。建议:
(1)你看过pcap.py第105行了吗?我猜“KeyError:138”意味着它正在尝试访问字典,但字典没有138(或“138”)作为键。包含138的变量是什么?来自数据包的一个字节?
(2)考虑询问pcap的作者/维护者。
(3)考虑提供pcap的URL。
答案 3 :(得分:-2)
我也遇到过类似的问题,但我是KEY ERROR 192。
我发现我的dkpt/pcap.py
不完整且版本很旧。
所以我卸载了当前的包
sudo apt-get remove python-dpkt
使用pip来安装最新的
pip install dpkt
这终于解决了问题,祝你好运!