Python中的IP地址列表到CIDR列表

时间:2011-07-15 14:10:43

标签: 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']

7 个答案:

答案 0 :(得分:6)

安装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)

答案 1 :(得分:3)

您可以使用netaddr在一行中执行此操作:

cidrs = netaddr.iprange_to_cidrs(ip_start, ip_end)

答案 2 :(得分:2)

好吧,summarize_address_range减少了将列表拆分为连续范围的问题。鉴于您可以使用

将IP地址转换为整数
def to_int(str): struct.unpack("!i",socket.inet_aton(str))[0]

这不应该太难。

答案 3 :(得分:1)

通过获取范围的输入文件并使用netaddr,将CIDR范围扩展为完整的IP列表 https://github.com/JeremyNGalloway/cidrExpand/blob/master/cidrExpand.py

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()

答案 4 :(得分:1)

对于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方法的有效属性。

答案 5 :(得分:1)

在python3中,我们有一个buildin模块:ipaddress。

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')]

答案 6 :(得分:0)

5 分钟解决方案

  • 复制 Excel 列中的列表
  • 转到“数据->文本到列”并用分隔符“分割”。
  • 如果您想要“/24”范围,请使用以下公式连接前 3 列 =A1&"."&B1&"."&C1&".0/24".
  • 复制新列并将“仅值”粘贴到另一列中。
  • 从“数据->删除重复项”中删除此列的重复项
  • 您的“/24”苹果酒清单已准备就绪。你可以用同样的方式制作“/16”和“/8”。

稍后谢谢我:-P