Lista de direcciones IP en Python a una lista de CIDR

¿Cómo convierto una lista de direcciones IP a una lista de CIDR? La biblioteca ipaddr-py de Google cuenta con un método denominado summaryize_address_range (first, last) que convierte dos direcciones IP (inicio y finalización) en una lista CIDR. Sin embargo, no puede manejar una lista de direcciones 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'] 

Puedes hacerlo en una línea usando netaddr:

 cidrs = netaddr.iprange_to_cidrs(ip_start, ip_end) 

Instale netaddr.

pip instalar netaddr

Usa las funciones de 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) 

Bueno, summarize_address_range reduce su problema para dividir su lista en rangos consecutivos. Dado que puedes convertir direcciones IP a enteros usando

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

Esto no debería ser demasiado difícil.

Expanda los rangos CIDR en listas de IP completas, tomando un archivo de entrada de rangos y utilizando 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() 

Para el comentario realizado por CaTalyst.X, tenga en cuenta que debe cambiar el código para que funcione.

Esta:

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

Necesita convertirse en esto:

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

Si usa la primera instancia del código, obtendrá una excepción ya que ip_range_to_cidrs no es un atributo válido para el método netaddr.

en python3, tenemos un módulo incorporado para esto: 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')]