Konwertowanie zakresu adresów IPv4 na maski sieciowe za pomocą bash

10

Mam plik wejściowy z adresami 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

Jak przekonwertować zakresy adresów na maski sieciowe? Wynik powinien być:

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
źródło
3
Kilka wyników, o które prosisz, jest niepoprawnych, więc żaden poprawny skrypt bash ich nie wygeneruje. Na przykład pierwszego zakresu nie można wyrazić za pomocą maski sieci: 94.228.16.0/21 daje 94.228.16.0 - 94.228.23.255, a następny szerszy 94.228.16.0/20 daje 94.228.16.0 - 94.228.31.255. Ponadto zakresy kończące się na .0 nie mogą być tworzone przez żadną maskę sieci.
zwets
@Zanna oszukujesz, zapytał plakat używając bash . Mój bash nie ma ipcalcwbudowanego. ;-)
zwets
@zwets ah Zrozumiałem! Ale masz rację, muszla potrzebuje dużo pomocy, hahaha
Zanna

Odpowiedzi:

14

Najpierw musisz zainstalować pakiet, aby wykonać konwersję

sudo apt install ipcalc

Teraz możesz to zrobić za pomocą tego małego skryptu (pamiętaj, że nie działa, jeśli cytujesz zmienną):

$ 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

lub bardziej czytelnie

while read line; do
   if [[ $line = *-* ]]; then 
     (ipcalc $line | sed '2!d')
   else echo $line
   fi
done < file
Zanna
źródło
@Oleksii zawsze przyjemność :)
Zanna
3

Być może nie jest zaskakujące, że istnieje do tego moduł perlowy CPAN Net :: CIDR .

Na przykład:

$ 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

Moduł jest dostępny w systemie Ubuntu po zainstalowaniu libnet-cidr-perlpakietu.

NB I nie walidacji wprowadzonych danych lub wyników.

steeldriver
źródło