Conversione di un intervallo di indirizzi IPv4 in maschere di rete utilizzando bash


10

Ho un file di input con indirizzi 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

Come posso convertire gli intervalli di indirizzi in maschere di rete? Il risultato dovrebbe essere:

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

3
Molti dei risultati richiesti non sono corretti, quindi nessuno script bash valido li produrrà. Ad esempio, il primo intervallo non è espressibile utilizzando una maschera di rete: 94.228.16.0/21 indica 94.228.16.0 - 94.228.23.255 e il successivo più ampio 94.228.16.0/20 indica 94.228.16.0 - 94.228.31.255. Inoltre, gli intervalli che terminano con .0 non possono essere prodotti da alcuna maschera di rete.
zwets

@Zanna stai tradendo, ha chiesto il poster usando bash . Il mio bash non ha ipcalcincorporato. ;-)
zwets

@zwets ah L'ho capito! Ma hai ragione, la shell ha bisogno di molto aiuto ahahah
Zanna,

Risposte:


14

Per prima cosa dovrai installare un pacchetto per fare la conversione

sudo apt install ipcalc

Ora puoi farlo con questo piccolo script (tieni presente che non funziona se citi la variabile):

$ 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 più facilmente

while read line; do
   if [[ $line = *-* ]]; then 
     (ipcalc $line | sed '2!d')
   else echo $line
   fi
done < file

@Oleksii sempre un piacere :)
Zanna

3

Forse non a caso, esiste un modulo perl CPAN Net :: CIDR per questo.

Quindi per esempio:

$ 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

Il modulo è disponibile su Ubuntu installando il libnet-cidr-perlpacchetto.

NB Ho Non convalidato l'input oi risultati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.