以字典格式Python追加Scapy结果

2024-06-16 13:11:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python编写了我的脚本,它成功地工作了。我在终端上获得、识别并打印了addr1,addr2,addr3。但是,我在尝试将这些结果以字典格式附加到CSV文件时遇到了几个错误。你知道吗

这是我以前在终端打印结果时的脚本:

#!/usr/bin/env python3
from scapy.all import *
import os

devices = set()
interface = "wlan0mon"
iface = "wlan0mon"

def sniffmgmnt(p):
    if p.haslayer(Dot11):
            devices.add(p.addr1)
            devices.add(p.addr2)
            devices.add(p.addr3)
            print(devices)

while True:
    for channel in range(1, 14):
            os.system("iwconfig" + iface + "channel" + str(channel))
            sniff(iface=interface, prn=sniffmgmnt, count=3, timeout=3, store=0)

然后,我尝试将这些结果以字典格式附加到CSV文件,其中addr3键:

#!/usr/bin/env python3
from scapy.all import *
from snifferCSV import CSV
import os
aps = dict()
devices = set()

headers = ['addr3', 'addr2', 'addr1']
csvFile = CSV('data.csv', headers)

interface = "wlan0mon"
iface = "wlan0mon"

def sniffmgmnt(p):
    if p.haslayer(Dot11):
            source.append(p.addr1);
            receiving.append(p.addr2);
            destination.append(p.addr3);
            csvFile.addToCSV( [addr3, addr2, addr1] )
while True:
    for channel in range(1, 14):
            os.system("iwconfig" + iface + "channel" + str(channel))
            sniff(iface=interface, prn=sniffmgmnt, count=3, timeout=3, store=0)

但是,脚本只输出终端中的头,我的CSV文件仍然是空的。你知道吗

下面是我的CSV类嗅探器

      class CSV(object):
        csvFile = None
        fileName = data.csv
        def __init__(self,fileName,headers):
            self.fileName = fileName
            self.prepareCSVFile(headers)
    def prepareCSVFile(self,headers):
            self.csvFile = open(self.fileName, 'w')
            headerString = self.prepareValues(headers)
            self.writeToCSV(headerString)
    def prepareValues(self,valueList):
            line = str()
            for item in valueList[:-1]:
                    line = line + str(item) + ','
            line += valueList[-1]
            return line
    def addToCSV(self,valueList):
            valueLine = self.prepareValues(valueList)
            self.writeToCSV(valueLine)
    def writeToCSV(self,line):
            print(line)
            self.csvFile.write(line)

我的目标是将字典格式的结果附加到CSV文件中,其中addr3是键。然而,我关于这个过程的逻辑是错误的。有人能给我指出正确的方向吗?你知道吗

提前谢谢 -JJ公司


Tags: csvcsvfileimportselfdeflinechannelfilename
1条回答
网友
1楼 · 发布于 2024-06-16 13:11:50

我接受了@coder的建议 open(self.fileName, 'w')open(self.fileName, 'a')但是只有我的头被附加到csv文件。你知道吗

最后我抓起了我的snifferCSV.py类,而是在主文件中嵌入了dictionary函数,在主文件中我使用成对dict构造函数和zip函数将数据附加到csv文件:

#!/usr/bin/env python3
from scapy.all import *
import csv
import os

interface = "wlan0mon"
iface = "wlan0mon"

def sniffmgmnt(p):
    if p.haslayer(Dot11):
            keys = [(p.addr3)]
            values = [(p.addr1, p.addr2)]
            my_dict = dict(zip(keys, values))
            with open('data.csv','a') as f:
                    w = csv.writer(f)
                    w.writerows(my_dict.items())
 while True:
    for channel in range(1, 14):
            os.system("iwconfig " + iface + " channel " + str(channel))
            sniff(iface=interface, prn=sniffmgmnt)

相关问题 更多 >