[英]Take sorted list of IP addresses and turn them into CIDR or Range
我目前正在尝试将一些 IP 地址添加到黑名单中,我已经收集了所有 IP 地址,计数在千范围内。 我正在尝试将所有单独的 IP 地址转换为范围或 CIDR。 我的第一种方法是对 IP 地址进行排序。 为此,我使用了
from socket import inet_aton
import struct
(sorted(list_of_ips, key=lambda ip: struct.unpack("!L", inet_aton(ip))[0]))
这将按数字顺序对我的 Ip 地址进行排序。 例子:
192.1.1.1
192.1.1.2
192.1.1.3
192.168.1.4
192.168.1.9
192.168.1.19
这只是我创建的一个小示例,实际列表可能包含 /24 或 /22 CIDR 中 90% 的 IP 地址
这里的目标是尝试将排序列表转换为范围或 CIDR,如下所示:
192.1.1.1 - 192.1.1.3
192.168.1.4 - 192.168.1.19
非常感谢任何帮助或建议。
尝试使用字典而不是对列表进行排序:
result = {}
for ip in list_of_ips:
sub = ip[:ip.rindex('.')] # first three segmants, ex: 192.168.1
hid = int(ip[ip.rindex('.')+1:]) # host id, last segmant
result[sub][0] = min(hid, result.setdefault(sub, [255, 0])[0])
result[sub][1] = max(hid, result.setdefault(sub, [255, 0])[1])
print(result)
for key, value in result.items():
print('{key}.{from_hid} - {key}.{to_hid}'.format(
key=key, from_hid=value[0], to_hid=value[1]
))
结果是:
{'192.1.1': [1, 55], '192.168.1': [4, 19]}
192.1.1.1 - 192.1.1.55
192.168.1.4 - 192.168.1.19
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.