繁体   English   中英

获取 IP 地址的排序列表并将它们转换为 CIDR 或 Range

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM