Intereting Posts
Какая цифра для базы больше 16 в bc? Когда grepping файл, grep возвращает true вместо строк, почему? Предупреждать о истечении срока действия пароля без изменения Как показать прогресс при загрузке initrd? Можно ли настроить dm-crypt для запроса ключа при каждом чтении / записи? Записать все прокрутки tmux в файл Как я могу предотвратить использование sudoer главного ключа LUKS? GlusterFS использует Geo-репликацию или нормальный блеск? В чем разница между ] и ? Установите раскладку клавиатуры ttyS0 Как скопировать / выставить многострочное выражение, которое я ввел в приглашении ZSH? Почему kill не работает из сценария, но работает с терминалом? Не удается получить связанные формы некоторых кластеров графена unicode с сочетанием диакритических знаков Как наложить аудиофайл на один файл изображения для видеоизображения, оптимизированного на YouTube, из командной строки? Команда Bash запускает команду каждый раз, когда отображается новое приглашение

Проверьте, принадлежит ли IP к определенному диапазону

У меня есть файл журнала, в котором перечислены диапазоны IP белых списков таким образом:

"217.29.0.0-217.29.255.255", "204.12.0.0-204.12.255.255", "198.54.223.0-198.54.223.255", 

Я также работаю над сценарием bash, который, помимо прочего, должен проверить этот файл журнала и определить, включен ли указанный IP-адрес.

Например, в случае IP 204.12.5.10 , как использовать файл журнала с указанными диапазонами для определения того, является ли этот IP-адрес частью диапазона в этом файле?

Полезная вещь, которую нужно помнить с помощью IP-адресов, состоит в том, что они на самом деле представляют собой только 32-битное число.

Таким образом, вы можете преобразовать их в десятичное число, умножив октеты на базу 256.

Например:

 217.29.0.0 == 216 * 256 ^ 3 + 29 * 256 ^2 + 0 * 256 ^1 + 0 * 256 ^ 0 == 3640655872 

Поэтому, учитывая диапазон, как указано выше, сначала конвертируйте их обоих, чтобы у вас было начало и конец. Затем сравните все входящие IP-адреса, чтобы узнать, подходят ли они.

Итак, что-то вроде этого (иллюстрирующий алгоритм):

 #!/usr/bin/env perl use strict; use warnings; my $ip_to_check = "204.12.5.10"; my $dword = 0; for ( split( '\.', $ip_to_check ) ) { $dword *= 256; $dword += $_ } print "Checking $dword\n"; while (<DATA>) { my ( $start, $finish ) = m/([\d\.]+)/g; my $start_dword = 0; for ( split '\.', $start ) { $start_dword *= 256; $start_dword += $_ } my $end_dword = 0; for ( split '\.', $finish ) { $end_dword *= 256; $end_dword += $_ } print "Range:\n"; print "\t$start \t=> $start_dword\n"; print "\t$finish \t=> $end_dword\n"; print "$ip_to_check is in $_\n" if $dword >= $start_dword and $dword <= $end_dword; } __DATA__ "217.29.0.0-217.29.255.255", "204.12.0.0-204.12.255.255", "198.54.223.0-198.54.223.255", 

Это довольно легко сделать как «скрипт проверки» – путем чтения файла (а не DATA ) и получения $ip_to_check из STDIN ).

(примечание – поскольку чистый perl может быть легко превращен в один линейный слой или сценарий для вызова. Или переписан – я полагаю, вы могли бы сделать это с помощью expr достаточно легко).

Вот версия awk :

 want=204.12.77.5 awk -v want=$want -F- ' function canon(ip){ split(" "ip,x,/[^0-9]+/) return sprintf("%03d%03d%03d%03d",x[2],x[3],x[4],x[5]) } BEGIN { val = canon(want) } { low = canon($1); high = canon($2); if(val>=low && val<=high)print "in range " $0 }' mylogfile 

canon функции принимает ip-адрес, разделяет числовые поля, затем расширяет их до трех цифр и возвращает строку. Он вызывается для двух значений в каждой строке, и их сравнивают с желаемым IP-адресом (установленным в начале), который также был «канонизирован».