使用 Scapy 删除重复的 IP 地址
Remove Duplicate IP Addresses with Scapy
我有一个脚本来侦听传入流量并在数据包到达线路时仅打印字符串“IP 1.1.1.1 53”。但是现在我正在对 IP 进行 IP 解析,我需要访问“ip_src”变量并且只对每个 ip 进行一次地理定位,而不是在它们进入时一遍又一遍地解析同一个 IP。我当前的代码是:
#!/usr/bin/python3
from scapy.all import *
import ipinfo
def print_summary(pkt):
if IP in pkt:
ip_src=pkt[IP].src
if UDP in pkt:
udp_sport=pkt[UDP].sport
access_token = ''
handler = ipinfo.getHandler(access_token)
match = handler.getDetails(ip_src)
c = match.details.get('city')
s = match.details.get('region')
strang = ("IP " + str(ip_src) + " " + str(udp_sport) + " " + str(c) + ", " + str(s))
print(strang)
sniff(filter="",prn=print_summary)
如您所见,“print_summary”函数由“prn”调用,每个 pkt 都会调用该函数。我基本上想模仿 uniq 和 sort 的功能,因为它们可以成功地从文件中过滤掉重复项,但我想将它们全部放在一个脚本中。
编辑 - 尝试设置():
所以使用代码:
from scapy.all import *
def print_summary(pkt):
if IP in pkt:
ip_src=pkt[IP].src
if UDP in pkt:
udp_sport=pkt[UDP].sport
lines_set = set(ip_src)
strang = ("IP " + str(ip_src) + " " + str(udp_sport))
if ip_src not in lines_set:
for line in lines_set:
print(line)
sniff(filter="",prn=print_summary)
我得到输出:(在终端中每个字符都有一个尾随换行符)
2 . 3 5 8 0 1 2 . 4 8 0 1 . 6
这会添加一个设置变量来跟踪您已经看到的地址。
#!/usr/bin/python3
from scapy.all import *
import ipinfo
seen = set()
def print_summary(pkt):
if IP in pkt:
ip_src=pkt[IP].src
if UDP in pkt and ip_src not in seen:
seen.add(ip_src)
udp_sport=pkt[UDP].sport
access_token = ''
handler = ipinfo.getHandler(access_token)
match = handler.getDetails(ip_src)
c = match.details.get('city')
s = match.details.get('region')
strang = ("IP " + str(ip_src) + " " + str(udp_sport) + " " + str(c) + ", " + str(s))
print(strang)
sniff(filter="ip",prn=print_summary)
我还更改了第二个 if
的缩进,以避免在您以某种方式收到没有 IP
成员的数据包时得到回溯;尽管我也更新了 filter
表达式,希望能从一开始就防止这种情况发生。
我有一个脚本来侦听传入流量并在数据包到达线路时仅打印字符串“IP 1.1.1.1 53”。但是现在我正在对 IP 进行 IP 解析,我需要访问“ip_src”变量并且只对每个 ip 进行一次地理定位,而不是在它们进入时一遍又一遍地解析同一个 IP。我当前的代码是:
#!/usr/bin/python3
from scapy.all import *
import ipinfo
def print_summary(pkt):
if IP in pkt:
ip_src=pkt[IP].src
if UDP in pkt:
udp_sport=pkt[UDP].sport
access_token = ''
handler = ipinfo.getHandler(access_token)
match = handler.getDetails(ip_src)
c = match.details.get('city')
s = match.details.get('region')
strang = ("IP " + str(ip_src) + " " + str(udp_sport) + " " + str(c) + ", " + str(s))
print(strang)
sniff(filter="",prn=print_summary)
如您所见,“print_summary”函数由“prn”调用,每个 pkt 都会调用该函数。我基本上想模仿 uniq 和 sort 的功能,因为它们可以成功地从文件中过滤掉重复项,但我想将它们全部放在一个脚本中。
编辑 - 尝试设置():
所以使用代码:
from scapy.all import *
def print_summary(pkt):
if IP in pkt:
ip_src=pkt[IP].src
if UDP in pkt:
udp_sport=pkt[UDP].sport
lines_set = set(ip_src)
strang = ("IP " + str(ip_src) + " " + str(udp_sport))
if ip_src not in lines_set:
for line in lines_set:
print(line)
sniff(filter="",prn=print_summary)
我得到输出:(在终端中每个字符都有一个尾随换行符)
2 . 3 5 8 0 1 2 . 4 8 0 1 . 6
这会添加一个设置变量来跟踪您已经看到的地址。
#!/usr/bin/python3
from scapy.all import *
import ipinfo
seen = set()
def print_summary(pkt):
if IP in pkt:
ip_src=pkt[IP].src
if UDP in pkt and ip_src not in seen:
seen.add(ip_src)
udp_sport=pkt[UDP].sport
access_token = ''
handler = ipinfo.getHandler(access_token)
match = handler.getDetails(ip_src)
c = match.details.get('city')
s = match.details.get('region')
strang = ("IP " + str(ip_src) + " " + str(udp_sport) + " " + str(c) + ", " + str(s))
print(strang)
sniff(filter="ip",prn=print_summary)
我还更改了第二个 if
的缩进,以避免在您以某种方式收到没有 IP
成员的数据包时得到回溯;尽管我也更新了 filter
表达式,希望能从一开始就防止这种情况发生。