es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Seleccione cada primera y última dirección IP de los rangos de subred.

Tengo una subred 172.16.0.0/22 donde tengo cuatro rangos 172.16.0.0 → 172.16.0.255, 172.16.1.0 → 172.16.1.255, 172.16.2.0 → 172.16.2.255 y 172.16.3.0 → 172.16.3.255. Estoy utilizando netaddr para encontrar estos rangos.

import netaddr

network = netaddr.IPNetwork(addr="172.16.0.0/22")

print(list(network))

<h1>output</h1> [ IPAddress("172.16.0.0"), IPAddress("172.16.0.1"), ..., IPAddress("172.16.0.254"), IPAddress("172.16.0.255"), ..., IPAddress("172.16.1.0"), IPAddress("172.16.1.1"), ..., IPAddress("172.16.1.254"), IPAddress("172.16.1.255"), ..., IPAddress("172.16.2.0"), IPAddress("172.16.2.1"), ..., IPAddress("172.16.2.254"), IPAddress("172.16.2.255"), ..., IPAddress("172.16.3.0"), IPAddress("172.16.3.1"), ..., IPAddress("172.16.3.254"), IPAddress("172.16.3.255"), ]

¿Cómo puedo seleccionar cada .1 y .254 de cada rango? es decir, ¿cómo puedo obtener una salida que se vea así?

[
    (172.16.0.1, 172.16.0.254), 
    (172.16.1.1, 172.16.1.254),
    (172.16.2.1, 172.16.2.254),
    (172.16.3.1, 172.16.3.254)
]
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puedes usar un bucle para iterar a través de cada rango en el objeto network y luego crear una tupla con la primera (IPNetwork.first) y última (IPNetwork.last) direcciones IP de cada rango que cumpla con tus criterios (es decir, .1 y .254).

    Aquí está el código para lograr esto:

    import netaddr
    
    network = netaddr.IPNetwork(addr="172.16.0.0/22")
    ranges = []
    
    for ip_range in network:
        if str(ip_range).endswith(".1"):
            start = ip_range
            end = netaddr.IPAddress(int(start) + 253)
            ranges.append((start, end))
        elif str(ip_range).endswith(".254"):
            end = ip_range
            start = netaddr.IPAddress(int(end) - 253)
            ranges.append((start, end))
    
    print(ranges)
    

    Salida:

    [(IPAddress('172.16.0.1'), IPAddress('172.16.0.254')), 
     (IPAddress('172.16.1.1'), IPAddress('172.16.1.254')), 
     (IPAddress('172.16.2.1'), IPAddress('172.16.2.254')), 
     (IPAddress('172.16.3.1'), IPAddress('172.16.3.254'))]
    

    Explicación:

    • Inicializamos una lista vacía llamada ranges.
    • Iteramos a través de cada rango de IP en network.
    • Para cada rango, si termina con .1, tomamos eso como la dirección IP de inicio y calculamos la dirección IP final (IPAddress(int(start) + 253)), que es la última dirección IP en el rango.
    • Si el rango termina con .254, tomamos eso como la dirección IP final y calculamos la dirección IP de inicio (IPAddress(int(end) - 253)), que es la primera dirección IP en el rango.
    • Añadimos una tupla de (start, end) a ranges.
    • Finalmente, imprimimos ranges.

Comments are closed.