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
,如图所示。既然你说它是重复的和唯一的,我假设 MPM
和 MPS
位是无用的。如果您需要它们,请告诉我。
示例(假设您有字符串 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 如果 ssid
和 mac
都是字符串,所以没有必要多个列表。
我觉得这个问题大多数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
,如图所示。既然你说它是重复的和唯一的,我假设 MPM
和 MPS
位是无用的。如果您需要它们,请告诉我。
示例(假设您有字符串 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 如果 ssid
和 mac
都是字符串,所以没有必要多个列表。