Conversion d'une plage d'adresses IPv4 en masques de réseau à l'aide de bash

10

J'ai un fichier d'entrée avec des adresses 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

Comment puis-je convertir les plages d'adresses en masques de réseau? Le résultat devrait être:

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
la source
3
Plusieurs des résultats que vous demandez sont incorrects, donc aucun script bash valide ne les produira. Par exemple, la première plage n'est pas exprimable à l'aide d'un masque de réseau: 94.228.16.0/21 donne 94.228.16.0 - 94.228.23.255, et la suivante plus large 94.228.16.0/20 donne 94.228.16.0 - 94.228.31.255. De plus, les plages se terminant par .0 ne peuvent être produites par aucun masque de réseau.
zwets
@Zanna tu triches, a demandé l'affiche en utilisant bash . Ma bash n'a pas de fonction ipcalcintégrée. ;-)
zwets
@zwets ah je l'ai compris! Mais vous avez raison, le shell a besoin de beaucoup d'aide hahaha
Zanna

Réponses:

14

Vous devez d'abord installer un package pour effectuer la conversion

sudo apt install ipcalc

Vous pouvez maintenant le faire avec ce petit script (veuillez noter qu'il ne fonctionne pas si vous citez 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

ou plus lisible

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

Sans surprise, il existe un module Perl CPAN Net :: CIDR pour cela.

Ainsi, par exemple:

$ 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

Le module est disponible sur Ubuntu en installant le libnet-cidr-perlpackage.

NB Je n'ai pas validé votre saisie ou les résultats.

tournevis
la source