运行Scapy Sniff函数时出错

1 投票
1 回答
5018 浏览
提问于 2025-04-18 04:58

我写了一个程序,用来监听网络中的 ICMP 数据包,并打印出它们的源地址。代码如下:

from scapy.all import *

def fun_callback(pkt):
    print str(pkt.payload.src)
sniff(prn = fun_callback, filter = 'icmp', timeout =5)

运行这个程序后,我遇到了这个错误。

[root@localhost icmp]# python test.py
WARNING: Failed to execute tcpdump. Check it is installed and in the PATH
WARNING: No route found for IPv6 destination :: (no default route?)
192.168.134.131
192.168.134.131
192.168.134.2
192.168.134.2
fe80::20c:29ff:fee4:a130
134.160.38.1
192.168.134.131
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    sniff(prn = fun_callback, filter = 'icmp', timeout =5)
  File "/usr/lib/python2.7/site-packages/scapy/sendrecv.py", line 586, in sniff
    r = prn(p)
  File "test.py", line 4, in fun_callback
    print str(pkt.payload.src)
  File "/usr/lib/python2.7/site-packages/scapy/packet.py", line 176, in __getattr__
     fld,v = self.getfield_and_val(attr)
  File "/usr/lib/python2.7/site-packages/scapy/packet.py", line 172, in getfield_and_val
    return self.payload.getfield_and_val(attr)
  File "/usr/lib/python2.7/site-packages/scapy/packet.py", line 172, in getfield_and_val
    return self.payload.getfield_and_val(attr)
  File "/usr/lib/python2.7/site-packages/scapy/packet.py", line 1057, in getfield_and_val
    raise AttributeError(attr)
AttributeError: src
[root@localhost icmp]# 

为什么会出现这个异常呢?

1 个回答

1

你抓取到了一个数据包,但这个数据包里面没有src属性。如果你想快速解决这个问题,可以写:

def fun_callback(pkt):
    if hasattr(pkt.payload, "src"):
        print str(pkt.payload.src)

但问题是,你其实并不知道pkt.payload到底是什么。如果你想要一个更好的解决办法,可以试试这样的:

def fun_callback(pkt):
    if IP in pkt: print pkt[IP].src
    elif IPv6 in pkt: print pkt[IPv6].src

或者更好的是,使用.sprintf()

sniff(prn=lambda pkt: pkt.sprintf("{IP:%IP.src%}{IPv6:%IPv6.src%}"),
      filter='icmp', timeout=5))

撰写回答