这可能听起来很愚蠢,但我在保存 python 中捕获的数据并将其发送到 postgresql 数据库方面没有很多经验。
我想做的是在 python 中使用 Scapy 扫描网络中的设备。运行小 scapy 代码后显示的设备应该发送到我的 postgresql 数据库。
有人以前尝试过这个,或者知道什么可以帮助做到这一点吗?
我尝试对此进行一些研究,但找不到任何可以回答我的问题的东西..
我已经考虑过将数据发送到我的数据库,但是当数据在 python 中显示时,我见过的方法都必须手动完成,而不是自动完成。
因此,您需要做的是两个单独的步骤:首先解析您通过 Scapy 收集的内容,然后将所有内容发送到 Postgres。我没有在实时捕获中完成此操作,而是在录制的 PCAP 中完成此操作。我想它也应该适用于实时捕获。
from scapy.all import *
import psycopg2
conn = psycopg2.connect(host="localhost", database="trainstation", user="username", password="password", port=5432)
cur=conn.cursor()
files = [list, of, pcaps]
def create_tab():
cur.execute("CREATE TABLE proberequests(id serial primary key, mac text, ssid text, rates integer[], channel integer, esr integer[], ht text);")
print("Created table")
conn.commit()
print("committed everything to db")
def parse_pcap(pcap_path):
pcap_flow = rdpcap(pcap_path)
sessions = pcap_flow.sessions()
counter = 0
for session in sessions:
for packet in sessions[session]:
counter +=1
try:
mac = get_mac(packet)
ssid, rates= get_ssid_and_rates(packet)
channel = get_ds(packet)
esr = get_esr(packet)
ht = get_ht(packet)
query = "INSERT INTO proberequests(mac, ssid, rates, channel, esr, ht) VALUES('" + mac + "', '" + str(ssid) + "', '" + str(rates) + "', " + str(channel) + ", '" + str(esr) + "', '" + str(ht) + "');"
cur.execute(query)
except Exception as e:
query = "INSERT INTO proberequests(mac, ssid, rates) VALUES('" + mac + "', '" + str(ssid) + "', '" + str(rates) + "');" # sorry for the messy workaround :X something isn't working with the esr if it's empty
cur.execute(query)
pass
conn.commit()
print("Added", counter, "probes to the database")
def get_mac(packet):
if packet.haslayer(Dot11ProbeReq):
return str(packet.addr2)
else:
return ""
def get_ssid_and_rates(packet):
if packet.haslayer(Dot11Elt):
ssid = packet.info.decode('ascii')
rates= set(packet[Dot11EltRates].rates)
return ssid, rates
else:
return '', {}
def get_ds(packet):
if packet.haslayer(Dot11EltDSSSet):
channel = packet[Dot11EltDSSSet].channel
return channel
else:
return 255
def get_ht(packet):
if packet.haslayer(Dot11EltHTCapabilities):
return str(packet[Dot11EltHTCapabilities].info)[2:-1]
else:
return ''
def get_esr(packet):
if packet[Dot11EltRates][1]:
return set(packet[Dot11EltRates][1].rates)
else:
return {}
create_tab()
for filename in files:
print("Adding file" , filename)
parse_pcap(filename)