python中的固定帧验证条件

python中的固定帧验证条件,python,validation,networking,scapy,Python,Validation,Networking,Scapy,我认为大多数python用户都可以回答这个问题,而且在知识方面是相当普遍的,但对我来说,我无法理解 代码如下: if ssid in net and p.addr2 not in clients: count +=1 get_oui(p.addr2) net.append(ssid) checkmac(p.addr2)

我认为大多数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)
对于第一种情况,第三个条件成立 对于第二种情况,第二个条件成立 对于第三个场景,第一个条件成立 对于第四个条件,所有条件都不成立,对吗?因为当使用“not in”和“in”操作数检查列表时,它会发现客户机和ssid都已经存在,因此会丢弃数据包,而这是一个有效的条件,意味着基本上有两个客户机正在寻找相同的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
elif ssid在网络中,p.addr2在客户端中:
获取信息(p.addr2)
checkmac(p.addr2)
打印str(count)+'>',p.addr2+'('+G+macf+W++')'+O+ssid+W
重复数据包开始打印出来,因为每个客户端发送多个具有相同数据的数据包,而这种情况可能会出现。我如何实现一个条件,以便在客户端[]中的多个客户端正在网络[]中查找多个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)
如果计数>0:
对于obs.items()中的k,v:
如果k和v!=p、 addr2和ssid:
计数+=1
获取信息(p.addr2)
net.append(ssid)
checkmac(p.addr2)
obs[p.addr2]=ssid
mps+=1
打印str(count)+'>',p.addr2++'('+G+macf+W++')'+O+ssid+W++'<'+Y+'MPS'+W
如果args.log:
wr_日志(p.addr2、ssid、macf)
其他:
计数+=1
获取信息(p.addr2)
net.append(ssid)
checkmac(p.addr2)
obs[p.addr2]=ssid
打印str(count)+'>',p.addr2++'('+G+macf+W++')'+O+ssid+W++'<'+Y+'MPS'+W
如果args.log:
wr_日志(p.addr2、ssid、macf)
这是怎么回事

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


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

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

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


关键是要理解,如果
ssid
mac
都是字符串,那么元组
(ssid,mac)
就是字典的一个字符串,因此不需要有多个列表。

使用哈希表或字典,从crc或ssid的某个哈希函数创建密钥+mac@cmidi我不知道如何实现它,正如您从我的帖子中猜到的,我并没有编写代码的真正经验。你能给我举个例子吗?我会在谷歌上查一下,但是当我们讨论这个问题时,一个直接的例子会非常有帮助。当然,只要我接近我的目标workstation@cmidi阅读我上面的编辑,我试着这样使用字典。好吧,基本上给出了一个可能重复的列表(SSID,MAC),只返回一个唯一的列表(SSID,MAC)?我不知道你所说的“扫描所有以前的对,删除列表中的每一对,dict与传入的SSID:MAC不匹配”是什么意思。如果你这样做了,你不会得到重复的结果吗?集合是否按顺序存储数据,即:按我添加它们的相同顺序?如果是这样的话,我就不能只存储我在“seed_SSID_macs”中得到的SSID和MAC,然后执行:如果(SSID,MAC)不在seed_SSID_macs中:打印“我需要什么”??如何将变量ssid和mac中的值存储到“数据包”中?数据集没有顺序。有些字典的顺序是:。seen_ssid_macs中的
if(ssid,mac)的要点是,它将
(ssid,mac)
视为一个单元,因此,如果ssid已被看到,但之前具有不同的mac,则它将返回
False
。我将尝试使用OrderedDict进行编辑。我查看dicts的目的是,我可以生成像['A':'S1,S2,S3','B':'S2,S3']这样的dict值,然后每次我从设备获得新数据包时都可以搜索它们,以查看是否存在具有特定已知SSID值的特定已知MAC,以及是否未找到此类MAC:SSID付费,即使在搜索了它自己的已知值(如果有的话)之后,也要打印它并添加到dict中。您想让我从脚本中发布一个更大的片段来显示如何获取ssid和mac值吗?您需要订购吗?我不认为显示ssid和mac是如何获得的是必要的,但是如果您显示了您真正想要做的事情,那就太好了
            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)
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