Python中的IP地址列表到CIDR列表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中的IP地址列表到CIDR列表相关的知识,希望对你有一定的参考价值。
如何将IP地址列表转换为CIDR列表? Google's ipaddr-py library有一个名为summarize_address_range(first,last)的方法,它将两个IP地址(开始和结束)转换为CIDR列表。但是,它无法处理IP地址列表。
Example:
>>> list_of_ips = ['10.0.0.0', '10.0.0.1', '10.0.0.2', '10.0.0.3', '10.0.0.5']
>>> convert_to_cidr(list_of_ips)
['10.0.0.0/30','10.0.0.5/32']
答案
你可以使用netaddr在一行中完成:
cidrs = netaddr.iprange_to_cidrs(ip_start, ip_end)
另一答案
安装netaddr。
pip install netaddr
使用netaddr的功能:
# Generate lists of IP addresses in range.
ip_range = netaddr.iter_iprange(ip_start, ip_end)
# Convert start & finish range to CIDR.
ip_range = netaddr.cidr_merge(ip_range)
另一答案
好吧,summarize_address_range
减少了将列表拆分为连续范围的问题。鉴于您可以使用将IP地址转换为整数
def to_int(str): struct.unpack("!i",socket.inet_aton(str))[0]
这不应该太难。
另一答案
通过获取范围的输入文件并利用netaddr https://github.com/JeremyNGalloway/cidrExpand/blob/master/cidrExpand.py将CIDR范围扩展为完整的IP列表
from netaddr import IPNetwork
import sys
if len(sys.argv) < 2:
print 'example usage: python cidrExpand.py cidrRanges.txt >> output.txt'
with open(sys.argv[1], 'r') as cidrRanges:
for line in cidrRanges:
ip = IPNetwork(line)
for ip in ip:
print ip
cidrRanges.close()
exit()
另一答案
对于CaTalyst.X发表的评论,请注意您需要更改为代码才能使其正常工作。
这个:
cidrs = netaddr.ip_range_to_cidrs('54.64.0.0', '54.71.255.255')
需要变成这样:
cidrs = netaddr.iprange_to_cidrs('54.64.0.0', '54.71.255.255')
如果您使用代码的第一个实例,则会出现异常,因为ip_range_to_cidrs不是netaddr方法的有效属性。
另一答案
在python 3中,我们有一个内置模块:ip address。
list_of_ips = ['10.0.0.0', '10.0.0.1', '10.0.0.2', '10.0.0.3', '10.0.0.5']
import ipaddress
nets = [ipaddress.ip_network(_ip) for _ip in list_of_ips]
cidrs = ipaddress.collapse_addresses(nets)
list(cidrs)
Out[6]: [IPv4Network('10.0.0.0/30'), IPv4Network('10.0.0.5/32')]
以上是关于Python中的IP地址列表到CIDR列表的主要内容,如果未能解决你的问题,请参考以下文章