2013-03-21 51 views
3

我試圖寫一個簡單的代碼,檢測IP地址爲scapy的IP源地址,問題是haslayer函數看起來沒有返回任何東西。'haslayer'函數不工作在scapy-python

from scapy.all import * 

while 1: 

    pkt = sniff (iface="eth0" , count = 1) 
    pkt.summary() 

    try: 
     if pkt.haslayer(IP): 
      ipsrc =pkt.getlayer(IP).src 
      print ipsrc 

    except: 
     pass 

結果是

Ether/IP/ICMP 10.0.2.15 > 10.0.2.11 echo-request 0/Raw 
Ether/IP/ICMP 10.0.2.15 > 10.0.2.11 echo-request 0/Raw 
Ether/IP/ICMP 10.0.2.15 > 10.0.2.11 echo-request 0/Raw 

所以我沒能趕上IP源地址的ICMP請求 任何想法?

回答

1

您的通用except掩蓋您的代碼可能遇到的任何錯誤。將pass更改爲raise並刪除任何特定的錯誤。例如。我與你的代碼中遇到的第一個是:

socket.error: [Errno 1] Operation not permitted 

運行爲root後,我得到了:

AttributeError: 'list' object has no attribute 'haslayer' 

和所有支持我的代碼更改一些工作(如root運行):

from scapy.all import * 

while 1: 

    pktl = sniff (iface="eth0" , count = 1) 
    pktl.summary() 

    for pkt in pktl: 
     try: 
      if pkt.haslayer(IP): 
       ipsrc =pkt.getlayer(IP).src 
       print ipsrc 
     except: 
      raise 

所以,你可能更好的刪除嘗試 - 除了一起

+0

像一個魅力工作,非常感謝。但沒有記錄,我需要做一個循環活的捕獲。 – Hussam 2013-03-22 20:03:47

+2

我從屬性錯誤中的'list'和計數參數'sniff'中猜測後者可以給出多個值。但重要的是不要丟棄有用的錯誤與一個非特定的'除了:' – Anthon 2013-03-22 20:24:12

1

@Hussam - 你不需要循環,但如果你使用語法pkt = sniff(),那麼它返回一個數組。另一種方式來寫這將是:

#!/usr/bin/env python 

from scapy.all import * 

pkt = sniff(count=1, filter="ip") 

if pkt[0].haslayer(IP): 
    print pkt[0][IP].src 

您還可以使用,每一個數據包被傳遞給函數的數據包,而不是一個陣列()通過嗅探功能做到這一點。一個例子是:

#!/usr/bin/env python 

from scapy.all import * 

def print_ip_src(pkt): 
    if pkt.haslayer(IP): 
     print pkt[IP].src 

sniff(prn=print_ip_src, filter="ip") 

請注意,沒有循環或從函數分配變量。這將無限期地運行,每個數據包將被髮送到我所包含的print_ip_src()函數。

P.S .:我使用了一個BPF過濾器來捕獲IP數據包,但是您應該仍然包含haslayer()函數,而不考慮安全措施。