Convertir un rango de direcciones IPv4 a máscaras de red usando bash

10

Tengo un archivo de entrada con direcciones IPv4:

94.228.16.0 - 94.228.25.255
94.241.136.0/24
94.241.136.0 - 94.241.136.255
94.29.128.0/17
94.29.128.0 - 94.29.191.0
94.29.192.0 - 94.29.255.0
94.74.181.0/24
94.74.181.0 - 94.74.181.31
94.74.181.128 - 94.74.181.255

¿Cómo puedo convertir los rangos de direcciones en máscaras de red? El resultado debería ser:

94.228.16.0/21
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.128.0/19
94.29.192.0/19
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25
Oleksii
fuente
3
Varios de los resultados que solicita son incorrectos, por lo que no se generarán secuencias de comandos bash válidas. Por ejemplo, el primer rango no se puede expresar usando una máscara de red: 94.228.16.0/21 da 94.228.16.0 - 94.228.23.255, y el siguiente 94.228.16.0/20 más amplio da 94.228.16.0 - 94.228.31.255. Además, los rangos que terminan en .0 no pueden ser producidos por ninguna máscara de red.
zwets
@Zanna, estás engañando, preguntó el cartel usando bash . Mi fiesta no tiene ipcalcincorporado. ;-)
zwets
@zwets ¡ah, lo he descubierto! Pero tienes razón, el caparazón necesita mucha ayuda jajaja
Zanna

Respuestas:

14

Primero deberá instalar un paquete para realizar la conversión

sudo apt install ipcalc

Ahora puede hacerlo con este pequeño script (tenga en cuenta que no funciona si cita la variable):

$ while read line; do if [[ $line = *-* ]]; then (ipcalc $line | sed '2!d'); else echo $line; fi; done < file
94.228.16.0/21
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.128.0/19
94.29.192.0/19
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25

o más legible

while read line; do
   if [[ $line = *-* ]]; then 
     (ipcalc $line | sed '2!d')
   else echo $line
   fi
done < file
Zanna
fuente
@Oleksii siempre es un placer :)
Zanna
3

Quizás no sea sorprendente, hay un módulo perl CPAN Net :: CIDR para esto.

Así por ejemplo:

$ perl -MNet::CIDR=range2cidr -lne 'print for range2cidr $_' yourfile
94.228.16.0/21
94.228.24.0/23
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.191.0/32
94.29.128.0/19
94.29.160.0/20
94.29.176.0/21
94.29.184.0/22
94.29.188.0/23
94.29.190.0/24
94.29.255.0/32
94.29.192.0/19
94.29.224.0/20
94.29.240.0/21
94.29.248.0/22
94.29.252.0/23
94.29.254.0/24
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25

El módulo está disponible en Ubuntu instalando el libnet-cidr-perlpaquete.

Nota : no he validado su entrada o los resultados.

conductor de acero
fuente