python 卡住框架验证条件

Stuck framing validation condition in python

我觉得这个问题大多数python用户都能回答,知识面比较笼统,但我自己想不通。

这是代码:

            if ssid in net and p.addr2 not in clients:
                count +=1
                get_oui(p.addr2)
                net.append(ssid)
                checkmac(p.addr2)
                mps+=1   
                print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W+' < '+Y+'MPS'+W
                if args.log:
                    wr_log(p.addr2,ssid,macf)

            elif ssid not in net and p.addr2 in clients:
                count +=1
                net.append(ssid)
                get_oui(p.addr2)
                clients.append(p.addr2)
                mpm+=1   
                print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W+' < '+Y+'MPM'+W
                if args.log:
                    wr_log(p.addr2,ssid,macf)
            elif ssid not in net and p.addr2 not in clients:                    
                count +=1                                     
                        net.append(ssid)
                get_oui(p.addr2)  
                checkmac(p.addr2) 
                print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W
                if args.log:
                    wr_log(p.addr2,ssid,macf)

现在这是你们需要知道的:这个脚本从空中一个接一个地监控和分析无线数据包,我从每个数据包中提取 ssid、mac 地址和制造商数据。客户端很容易发送大量具有相同数据的重复数据包,其中将包含具有独特数据的独特数据包。

当前SSID存储在ssid中,当前MAC存储在p.addr2中。先前的 ssid 和 p.addr2 值分别存储在列表中 - 'net' 和 'clients'。

对于大多数数据包,我的代码仍然存在并且有效,但在一种特殊情况下我丢失了。考虑这些 ssid 和 mac 地址的假设值:

SSID  MAC
S1    A
S2    A
S1    B
S2    B

对于第一种情况,第三个条件成立 对于第二种情况,第二个条件成立 对于第三种情况,第一个条件成立 对于第四个条件,none个条件成立,我说的对吗?因为当使用 "not in" 和 "in" 操作数检查列表时,它发现客户端和 ssid 都已经存在,因此丢弃数据包,而这是一个有效条件,意味着基本上有 2 个客户端正在寻找对于同一个 ssid,我希望它被打印出来。但如果我这样做:

elif ssid in net and p.addr2 in clients:
                get_oui(p.addr2)  
                checkmac(p.addr2)
                print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W

重复的数据包开始打印出来,因为每个客户端发送多个具有相同数据的数据包,而这种情况可能会发生。我如何实现一个条件,以便我可以验证 clients[] 中的多个客户端正在 net[] 中寻找多个 ssid 的情况???

根据cmidi的建议:我尝试使用字典并尝试以这种方式访问​​它,它仍然给我重复!

            if count > 0:
                for k,v in obs.items():
                    if k and v != p.addr2 and ssid: 
                        count +=1
                        get_oui(p.addr2)
                        net.append(ssid)
                        checkmac(p.addr2)
                        obs[p.addr2] = ssid
                        mps+=1   
                        print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W+' < '+Y+'MPS'+W
                        if args.log:
                            wr_log(p.addr2,ssid,macf)
            else:
                count +=1
                get_oui(p.addr2)
                net.append(ssid)
                checkmac(p.addr2)
                obs[p.addr2] = ssid   
                print str(count)+'>',p.addr2+' ('+G+macf+W+') <--Probing--> '+O+ssid+W+' < '+Y+'MPS'+W
                if args.log:
                    wr_log(p.addr2,ssid,macf)

这是怎么回事?

@lmz 好的,所以根据要求,这就是一切工作的方式,或者更确切地说应该工作的方式:

对于我扫描的每个数据包,我都会获得我的 SSID、MAC 和制造商值。我想保存这些数据,只有 SSID 和 MAC,因为作为一对,它们在丢弃其他重复数据包后将是唯一的。对于第一个数据包,我不经任何检查就打印值,我们得到了第一组值,然后从第二个数据包开始,重复检查和某些条件变得活跃。理想情况下尽可能减少代码,这里应该直接检查自列表中的第一个数据包以来捕获的 SSID:MAC 对,dict,ordereddict 等。这里不仅仅是被订购,他们的代码需要能够扫描所有以前的对,删除列表中的每一对,与传入的 SSID:MAC 不匹配的字典。如果找不到重复项,新的 SSID:MAC 对将添加到列表、字典等中。否则,如果找到重复项,循环就会中断,我们将移至第三个数据包,依此类推。

我给出了一个字典示例,因此您也可以存储相关数据。如果您想要订购,只需将 dict 更改为 collections.OrderedDict,如图所示。既然你说它是重复的和唯一的,我假设 MPMMPS 位是无用的。如果您需要它们,请告诉我。

示例(假设您有字符串 SSID & MAC):

from collections import OrderedDict
packets = [
    ('S1', 'A'), ('S2', 'A'), ('S1', 'B'),
    ('S2', 'B'), ('S1', 'A'), ('S1', 'B')
]



# seen_packets = OrderedDict() # if order is required
seen_packets = dict()

for ssid, mac in packets:
    print "Considering SSID ", ssid, " and MAC ", mac
    ssid_mac = (ssid, mac)
    if ssid_mac in seen_packets:
        print "Seen this before - not adding"
    else:
        data_for_packet = True # your own data here (timestamp?)
        print "Never seen this SSID/MAC combo before"
        seen_packets[ssid_mac] = data_for_packet

print "Unique ssid,mac pairs with data:"
for (ssid, mac), data in seen_packets.iteritems():
    print ssid, mac, data

关键是要理解元组 (ssid, mac) 是字典的 perfectly valid key 如果 ssidmac 都是字符串,所以没有必要多个列表。