Преобразование диапазона адресов 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

@ Занна, ты обманываешь, плакат спросил с помощью bash . Мой 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

Возможно, неудивительно, что для этого существует perl-модуль CPAN 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пакета.

NB. Я не подтвердил ваш вклад или результаты.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.