¿Cómo puedo generar todas las direcciones IP posibles de una lista de rangos de ip en Python?

Digamos que tengo un archivo de texto que contiene un montón de rangos de ip como este:

xxxx-yyyy xxxx-yyyy xxxx-yyyy xxxx-yyyy xxxx-yyyy 

xxxx es el valor inicial y aaaa es el valor final del rango.

¿Cómo puedo convertir estos rangos de ip a todos los IP posibles en un nuevo archivo de texto en python?

PD: Esta pregunta no es la misma que cualquiera de mis preguntas anteriores. Pregunté “cómo generar todos los ips posibles desde las anotaciones cidr” en mi pregunta anterior. Pero aquí pregunto “cómo generar desde la lista de rango de ip”. Estas son cosas diferentes.

Esta función devuelve todas las direcciones ip como de principio a fin:

 def ips(start, end): import socket, struct start = struct.unpack('>I', socket.inet_aton(start))[0] end = struct.unpack('>I', socket.inet_aton(end))[0] return [socket.inet_ntoa(struct.pack('>I', i)) for i in range(start, end)] 

Estos son los bloques de construcción para construirlo por tu cuenta:

 >>> import socket, struct >>> ip = '0.0.0.5' >>> i = struct.unpack('>I', socket.inet_aton(ip))[0] >>> i 5 >>> i += 1 >>> socket.inet_ntoa(struct.pack('>I', i)) '0.0.0.6' 

Ejemplo:

 ips('1.2.3.4', '1.2.4.5') ['1.2.3.4', '1.2.3.5', '1.2.3.6', '1.2.3.7', ..., '1.2.3.253', '1.2.3.254', '1.2.3.255', '1.2.4.0', '1.2.4.1', '1.2.4.2', '1.2.4.3', '1.2.4.4'] 

Leer del archivo

En tu caso puedes leer desde un archivo como este:

 with open('file') as f: for line in f: start, end = line.strip().split('-') # .... 

Solo Python 3, para IPv4, la misma idea con @User pero usa la nueva biblioteca estándar de Python3: ipaddress ip

IPv4 está representado por 4 bytes. Entonces, la siguiente IP es el siguiente número, un rango de IP puede representarse como un rango de números enteros.

0.0.0.1 es 1

0.0.0.2 es 2

0.0.0.255 es 255

0.0.1.0 es 256

0.0.1.1 es 257

Por código (ignorar el In []: y Out [] 🙂

 In [68]: from ipaddress import ip_address In [69]: ip_address('0.0.0.1') Out[69]: IPv4Address('0.0.0.1') In [70]: ip_address('0.0.0.1').packed Out[70]: b'\x00\x00\x00\x01' In [71]: int(ip_address('0.0.0.1').packed.hex(), 16) Out[71]: 1 In [72]: int(ip_address('0.0.1.0').packed.hex(), 16) Out[72]: 256 In [73]: int(ip_address('0.0.1.1').packed.hex(), 16) Out[73]: 257 

ip.packed.hex() devuelve la forma hexadecimal de 4 bytes, ya que es hexadecimal, es más corto (por ejemplo: 0xff hex == 255 decimal == 0b11111111 binario), y por lo tanto, a menudo se usa para representar bytes. int(hex, 16) devuelve un valor entero correspondiente al valor hexadecimal ya que es más fácil de usar y se puede usar como entrada para ip_address .

 from ipaddress import ip_address def ips(start, end): '''Return IPs in IPv4 range, inclusive.''' start_int = int(ip_address(start).packed.hex(), 16) end_int = int(ip_address(end).packed.hex(), 16) return [ip_address(ip).exploded for ip in range(start_int, end_int)] ips('192.168.1.240', '192.168.2.5') 

Devoluciones:

 ['192.168.1.240', '192.168.1.241', '192.168.1.242', '192.168.1.243', '192.168.1.244', '192.168.1.245', '192.168.1.246', '192.168.1.247', '192.168.1.248', '192.168.1.249', '192.168.1.250', '192.168.1.251', '192.168.1.252', '192.168.1.253', '192.168.1.254', '192.168.1.255', '192.168.2.0', '192.168.2.1', '192.168.2.2', '192.168.2.3', '192.168.2.4'] 

prueba esto:

 def ip_range(start_ip,end_ip): start = list(map(int,start_ip.split('.'))) end = list(map(int,end_ip.split('.'))) iprange=[] while start!=list(map(int,end_ip.split('.'))): for i in range(len(start)-1,-1,-1): if start[i]<255: start[i]+=1 break else: start[i]=0 iprange.append('.'.join(map(str,start))) return iprange