我认为大多数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值分别存储在lists 'net‘和'clients’中。
对于大多数数据包,我的代码存活下来并且是有效的,但是对于一个特殊的条件,我丢失了。考虑以下假设的ssid和mac地址的值:
SSID MAC
S1 A
S2 A
S1 B
S2 B
对于第一个场景,第三个条件适用于第二个场景,第二个条件适用于第三个场景,第一个条件适用于第四个条件,所有条件都不成立,对吗?因为当使用"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:从列表中的第一个数据包、dict、ordereddict等中捕获的MAC对。在这里,除了排序之外,它们还需要能够扫描所有以前的对,删除列表中的每一对,与传入的SSID:MAC不匹配的dict。如果找不到副本,则将新的SSID:MAC对添加到列表、dict等中,否则,如果发现重复,则循环中断,然后我们移动到第三个数据包,以此类推。
发布于 2015-05-08 20:22:34
我给出了一个字典的例子,这样你也可以存储相关的数据。如果您想要订单,只需将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
都是字符串,那么就不需要有多个列表。
https://stackoverflow.com/questions/30134557
复制相似问题