List of IP addresses in Python to a list of CIDR

后端 未结 6 1053
温柔的废话
温柔的废话 2021-01-03 04:21

How do I convert a list of IP addresses to a list of CIDRs? Google\'s ipaddr-py library has a method called summarize_address_range(first, last) that converts two IP addres

相关标签:
6条回答
  • 2021-01-03 05:00

    in python3, we have a buildin module for this: 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')]
    
    0 讨论(0)
  • 2021-01-03 05:05

    You can do it in one line using netaddr:

    cidrs = netaddr.iprange_to_cidrs(ip_start, ip_end)
    
    0 讨论(0)
  • 2021-01-03 05:08

    Expand CIDR ranges into full IP lists, by taking an input file of ranges and utilizing netaddr 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()
    
    0 讨论(0)
  • 2021-01-03 05:13

    For the comment made by CaTalyst.X, note that you need to change to code in order for it to work.

    This:

    cidrs = netaddr.ip_range_to_cidrs('54.64.0.0', '54.71.255.255')
    

    Needs to become this:

    cidrs = netaddr.iprange_to_cidrs('54.64.0.0', '54.71.255.255')
    

    If you use the first instance of the code, you'll get an exception since ip_range_to_cidrs isn't a valid attribute to the netaddr method.

    0 讨论(0)
  • 2021-01-03 05:18

    Well, summarize_address_range reduces your problem to splitting your list into consecutive ranges. Given that you can convert IP addresses to integers using

    def to_int(str): struct.unpack("!i",socket.inet_aton(str))[0]
    

    this should not be too hard.

    0 讨论(0)
  • 2021-01-03 05:26

    Install netaddr.

    pip install netaddr

    Use functions of 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)
    
    0 讨论(0)
提交回复
热议问题