在python2,3中运行Scapy Sniff函数时出错

时间:2017-04-05 08:15:48

标签: python python-2.7 python-3.x scapy

我写了这个程序来嗅探网络中的arp数据包并在那里打印源地址。代码如下: (这只是关于亚马逊破折号狙击包的修改示例源)

@ManyToOne

错误消息是

from scapy.all import *

import urllib

global flag

def arp_display(pkt):


if pkt[ARP].op == 1: #who-has (request)

#if pkt[ARP].psrc == '0.0.0.0': # ARP Probe

  if pkt[ARP].hwsrc == '0c:47:c3:e6:c5:b7': # Energizier

    print ("Pushed Energizier")

    if (flag == NULL) or (flag == 0):

       url = url + "LED=0"

       req = urllib2.Request(url)

       response = urllib2.urlopen(req)

       flag = 1

       print ( "send signal")

    else :

       url = url + "LED=1"

       req = urllib2.Request(url)

       response = urllib2.urlopen(req)

       flag = 0


  elif pkt[ARP].hwsrc == 'a4:af:66:df:9e:45': # Elements

    print ("Pushed Elements")

  else:

    print ("ARP Probe from unknown device: " + pkt[ARP].hwsrc)



print ( sniff(prn=arp_display, filter="arp", store=0, count=10,lfilter=lambda pkt: ARP in pkt) )

我真的不知道为什么要打印出这样的错误信息

1 个答案:

答案 0 :(得分:2)

您正尝试访问和修改函数中的全局变量。但是,当您在函数范围内分配此flag变量时,如:

flag = 1

flag = 0

flag被假定为局部变量,它在外部作用域中隐藏相同的命名全局变量。请看这里:Why am I getting an UnboundLocalError when the variable has a value?

这是代码发生的最小例子:

flag = 0
def func():
    if flag==0:
        print("flag is 0")
        flag = 1

调用func()会引发同样的错误:

UnboundLocalError: local variable 'flag' referenced before assignment

解决方法是使用global关键字修改本地范围内的全局变量。像这样:

flag = 0
def func():
    global flag
    if flag==0:
        print("flag is 0")
        flag = 1

请查看答案中的链接以便更好地理解。