Python 在不应该的时候附加到列表
Python appending to a list when it shouldn't
为了好玩,我正在制作一个简单的脚本来嗅探网络并记录 IP 地址及其 mac 地址。
from scapy.all import *
import sys
import os
regestry = [['192.168.0.1','E8:DE:27:55:17:F4']]
def islocal(str):
lst = str.split('.')
if lst[0] == '192' and lst[1] == '168':
return True
else:
return False
def packatalize(packet):
try:
dst = packet["IP"].dst
if islocal(dst):
var = False
for reg in regestry:
if dst not in reg:
print 'not in reg'
var = True
elif dst in reg:
print 'in reg'
var = False
pass
if var == True:
print 'appending'
regestry.append([dst,packet.dst])
print regestry
var = False
else:
pass
else:
print 'not local'
pass
except Exception as e:
print str(e)
sniff(prn=packatalize)
sys.exit()
这是我想要它做的,但出于某种原因,它会一遍又一遍地附加这些 IP 和 MAC 注册表,即使它们已经存在。
For fun I'm making a simple script that sniffs on a network and logs
the IP addresses and their mac addresses.
那么我可以建议您为您的特定应用程序使用适当的数据结构吗? dict
似乎足够好,因为它的键是唯一的,即 重新更新现有 IP 的 mac 地址,将更新注册表中的 mac 地址而不是创建一个新条目.
>>> registry = {}
>>> registry['192.168.0.1'] = 'E8:DE:27:55:17:F4'
要使用字典:
>>> registry['192.168.0.2'] = 'E8:DE:27:55:17:F1'
>>> for ip, mac in registry.iteritems():
... print ip, mac
...
192.168.0.2 E8:DE:27:55:17:F1
192.168.0.1 E8:DE:27:55:17:F4
如果你想让你的字典保持插入顺序,请满足OrderedDict
如果你想使用集合而不是用列表模拟一个
与其手动检查一个值是否已经在列表中并且只在它不存在时添加,您可以使用一个集合(这可能比自己写一个更不容易出错 Python代码)
>>> registry = set()
此行创建一个集合,在您的示例中,它将是 "unique" 个值的列表
>>> registry.add(('192.168.0.1','E8:DE:27:55:17:F4'))
如果该值尚不存在,则添加该值。
然后使用它,它与列表没有太大区别,例如
>>> registry.add(('192.168.0.2','E8:DE:27:55:17:F1'))
>>> for reg in registry:
... print reg
...
('192.168.0.1', 'E8:DE:27:55:17:F4')
('192.168.0.2', 'E8:DE:27:55:17:F1')
请注意,该集不会维护插入顺序。
您没有检测项目是否在列表中
for reg in regestry:
if dst not in reg:
print 'not in reg'
var = True
elif dst in reg:
print 'in reg'
var = False
pass
执行此代码后,如果新项与列表的 last 元素匹配,则 'var' 为真 - 它在每次迭代时都会被比较结果覆盖。之后的代码将 'var' 视为表示新项目是否匹配 any 项目。
也许您打算在最后一行使用 break 而不是 pass?这将解决这个问题。
为了好玩,我正在制作一个简单的脚本来嗅探网络并记录 IP 地址及其 mac 地址。
from scapy.all import *
import sys
import os
regestry = [['192.168.0.1','E8:DE:27:55:17:F4']]
def islocal(str):
lst = str.split('.')
if lst[0] == '192' and lst[1] == '168':
return True
else:
return False
def packatalize(packet):
try:
dst = packet["IP"].dst
if islocal(dst):
var = False
for reg in regestry:
if dst not in reg:
print 'not in reg'
var = True
elif dst in reg:
print 'in reg'
var = False
pass
if var == True:
print 'appending'
regestry.append([dst,packet.dst])
print regestry
var = False
else:
pass
else:
print 'not local'
pass
except Exception as e:
print str(e)
sniff(prn=packatalize)
sys.exit()
这是我想要它做的,但出于某种原因,它会一遍又一遍地附加这些 IP 和 MAC 注册表,即使它们已经存在。
For fun I'm making a simple script that sniffs on a network and logs the IP addresses and their mac addresses.
那么我可以建议您为您的特定应用程序使用适当的数据结构吗? dict
似乎足够好,因为它的键是唯一的,即 重新更新现有 IP 的 mac 地址,将更新注册表中的 mac 地址而不是创建一个新条目.
>>> registry = {}
>>> registry['192.168.0.1'] = 'E8:DE:27:55:17:F4'
要使用字典:
>>> registry['192.168.0.2'] = 'E8:DE:27:55:17:F1'
>>> for ip, mac in registry.iteritems():
... print ip, mac
...
192.168.0.2 E8:DE:27:55:17:F1
192.168.0.1 E8:DE:27:55:17:F4
如果你想让你的字典保持插入顺序,请满足OrderedDict
如果你想使用集合而不是用列表模拟一个
与其手动检查一个值是否已经在列表中并且只在它不存在时添加,您可以使用一个集合(这可能比自己写一个更不容易出错 Python代码)
>>> registry = set()
此行创建一个集合,在您的示例中,它将是 "unique" 个值的列表
>>> registry.add(('192.168.0.1','E8:DE:27:55:17:F4'))
如果该值尚不存在,则添加该值。
然后使用它,它与列表没有太大区别,例如
>>> registry.add(('192.168.0.2','E8:DE:27:55:17:F1'))
>>> for reg in registry:
... print reg
...
('192.168.0.1', 'E8:DE:27:55:17:F4')
('192.168.0.2', 'E8:DE:27:55:17:F1')
请注意,该集不会维护插入顺序。
您没有检测项目是否在列表中
for reg in regestry:
if dst not in reg:
print 'not in reg'
var = True
elif dst in reg:
print 'in reg'
var = False
pass
执行此代码后,如果新项与列表的 last 元素匹配,则 'var' 为真 - 它在每次迭代时都会被比较结果覆盖。之后的代码将 'var' 视为表示新项目是否匹配 any 项目。
也许您打算在最后一行使用 break 而不是 pass?这将解决这个问题。