2013-03-21 434 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()函数,而不考虑安全措施。