Python不应该附加到列表中

时间:2017-01-06 21:34:53

标签: python python-2.7 scapy

为了好玩,我制作了一个简单的脚本,可以在网络上嗅探并记录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注册表。

2 个答案:

答案 0 :(得分:3)

  

为了好玩,我正在制作一个简单的脚本,嗅探网络和日志   IP地址及其mac地址。

那么我可以建议您为特定应用程序使用适当的数据结构吗? dict似乎已经足够好了,因为它的密钥是唯一的,即重新更新现有IP的mac地址,会更新注册表中的mac地址而不是创建新条目

>>> registry = {}
>>> registry['192.168.0.1'] = 'E8:DE:27:55:17:F4'

使用dict:

>>> 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代码自己编写的更不容易出错),而不是手动检查某个值是否已经存在于列表中而只是添加(如果它不存在) p>

>>> registry = set()

此行创建一个集合,在您的示例中,它将是“唯一”值列表

>>> 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')

请注意,该套装不会维持广告订单。

答案 1 :(得分:3)

您无法检测项目是否在列表中

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'之后的代码,就像它指示新项目是否匹配任何项目一样。

也许您打算在最后一行使用 break 而不是传递?这将解决这个问题。