2014-05-01 79 views
1

我編寫了這個程序來嗅探網絡中的icmp數據包並打印出那裏的源地址。代碼如下:運行Scapy嗅探函數時出錯

from scapy.all import * 

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

運行此程序後,我收到此錯誤。

[[email protected] 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 
[[email protected] icmp]# 

爲什麼會發生這種例外情況?

+0

似乎沒有src屬性。再次檢查文檔 – Moj

+1

當數據包中的特定字段爲空或不存在時,通常會發生這種情況。在這種情況下,你的數據包似乎沒有源字段。 – TheCreator232

回答

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))