Перетворення діапазону IPv4-адрес у мережеві маски за допомогою bash


10

У мене є вхідний файл з 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

Як я можу конвертувати діапазони адрес у мережеві маски? Результатом має бути:

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
Деякі результати, про які ви запитуєте, невірні, тому жоден дійсний скрипт bash не видасть їх. Наприклад, перший діапазон не виражається за допомогою мережевої маски: 94.228.16.0/21 дає 94.228.16.0 - 94.228.23.255, а наступний ширший 94.228.16.0/20 дає 94.228.16.0 - 94.228.31.255. Також діапазони, що закінчуються на .0, не можуть бути створені жодною мережевою маскою.
zwets

@Zanna ви обманюєте, запитав плакат, використовуючи bash . Мій баш не має ipcalcвбудованого. ;-)
zwets

@zwets ах я зрозумів це! Але ти маєш рацію, снаряд потребує великої допомоги ха-ха
Занна

Відповіді:


14

Спочатку вам потрібно буде встановити пакет, щоб здійснити конверсію

sudo apt install ipcalc

Тепер ви можете зробити це за допомогою цього маленького сценарію (зауважте, що він не працює, якщо ви цитуєте змінну):

$ 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

або більш читабельно

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

@Oleksii завжди приємно :)
Zanna

3

Мабуть, не дивно, що для цього існує CPAN-Perl модуль Net :: CIDR .

Так, наприклад:

$ 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

Модуль доступний на Ubuntu, встановивши libnet-cidr-perlпакет.

Примітка: Я не підтвердив ваші дані чи результати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.