在Python中运行Scapy Sniff函数的错误2,3
问题描述:
我编写了这个程序来嗅探网络中的arp数据包并打印出那里的源地址。代码如下: (这仅仅是修改样本源约亚马逊破折号按钮狙击包一点点)在Python中运行Scapy Sniff函数的错误2,3
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))
错误消息
Traceback (most recent call last):
File "/share/Web/python/dash_check.py", line 54, in <module>
print (sniff(prn=arp_display, filter="arp", store=0,
count=10,lfilter=lambda pkt: ARP in pkt))
File "/opt/lib/python2.7/site-packages/scapy/sendrecv.py", line 620, in sniffr = prn(p)
File "/share/Web/python/dash_check.py", line 21, in arp_display
if (flag == NULL) or (flag == 0):
UnboundLocalError: local variable 'flag' referenced before assignment
我真的不知道为什么打印出来像这样的错误消息
答
您正试图访问和修改您的函数中的全局变量。但是当你要分配功能的范围内,本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
请检查链接及回答以获得更好的理解。
在使用'flag'之前,它在第21行的'if'语句中有一个值。您需要为'flag'变量赋值或甚至是'None' '声明。 –
如果可以,请编辑您的问题标题,因为您的问题与“scrapy”无关。 –