URL: https://www.opennet.dev/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID15
Нить номер: 4415
[ Назад ]

Исходное сообщение
"Поиск, проверка наличия подсети в текстовом файле по IP"

Отправлено Seryoga2014 , 23-Апр-18 00:44 
Имеется некий IP, пусть будет 8.8.8.8. Имеется текстовый файл с длинным списком подсетей с различными длинами префикса, к примеру, /12, /15, /24. Возможно ли написать какой-то хитрый grep, который бы проверял есть ли среди этих подсетей та, в которую входит нужный нам IP, допустим, упомянутый 8.8.8.8/32? Может на Perl-е что-то или ещё на чём? Если кто знает, то, просьба, привести пример такого скрипта.


Содержание

Сообщения в этом обсуждении
"Поиск, проверка наличия подсети в текстовом файле по IP"
Отправлено Виктор , 23-Апр-18 01:54 
> Имеется некий IP, пусть будет 8.8.8.8. Имеется текстовый файл с длинным списком
> подсетей с различными длинами префикса, к примеру, /12, /15, /24. Возможно
> ли написать какой-то хитрый grep, который бы проверял есть ли среди
> этих подсетей та, в которую входит нужный нам IP, допустим, упомянутый
> 8.8.8.8/32? Может на Perl-е что-то или ещё на чём? Если кто
> знает, то, просьба, привести пример такого скрипта.

например на php:
$host = "192.168.22.66"
$subnet_string = "192.168.22.0/24";
$ip_arr = explode("/", $subnet_string);
$subnet_addr = $ip_arr[0];
$mask_bits = $ip_arr[1];
$host_bits = 32 - $mask_bits;
$num_hosts = pow(2, $host_bits) - 1;

$host_long = ip2long($host);
$subnet_long = ip2long($subnet_addr)

if ($host_long >= $subnet_long && $host_long <= $subnet_long + $num_hosts)
{
    echo "Found host in subnet"
}


"Поиск, проверка наличия подсети в текстовом файле по IP"
Отправлено Seryoga2014 , 23-Апр-18 10:55 
Прошу пардона, я совсем не в теме как можно запускать php из bash? WEB-сервера у меня
нет, только консоль. И мне нужно проверять file.txt с длинным списком подсетей - как его
туда подставить? Пример строчки в bash можно?

"Поиск, проверка наличия подсети в текстовом файле по IP"
Отправлено ыы , 23-Апр-18 11:22 
> Прошу пардона, я совсем не в теме как можно запускать php из
> bash? WEB-сервера у меня
> нет, только консоль. И мне нужно проверять file.txt с длинным списком подсетей
> - как его
> туда подставить? Пример строчки в bash можно?

Забудьте обо всем этом. в приведенном кусте кода есть несколько опечаток (намеренных? :) что приведет к невозможности его выполнения. И это будет непреодолимым препятствием для вас.

Плюс к тому же этот код- концепт который вам надо дописать по месту...


"Поиск, проверка наличия подсети в текстовом файле по IP"
Отправлено Виктор , 23-Апр-18 14:21 
> Забудьте обо всем этом. в приведенном кусте кода есть несколько опечаток (намеренных?
> :) что приведет к невозможности его выполнения. И это будет непреодолимым
> препятствием для вас.
> Плюс к тому же этот код- концепт который вам надо дописать по
> месту...

Не специально. Я взял старый кусок и немного дорисовал до его задач... Ну да, пропустил несколько ";"... Я ж не думал, что он настолько безголовый, что имея код, разложенный по полочкам и не сможет разобраться.


"Поиск, проверка наличия подсети в текстовом файле по IP"
Отправлено Seryoga2014 , 24-Апр-18 14:07 
> Не специально. Я взял старый кусок и немного дорисовал до его задач...
> Ну да, пропустил несколько ";"... Я ж не думал, что он
> настолько безголовый, что имея код, разложенный по полочкам и не сможет
> разобраться.

В php я полный 0, вообще представления не имею что да как там. Что-то делаю только в bash, немного знаю sed, awk, но и тут не мегагуру - иначе не  задавал бы вопросов. У меня совершенно другого рода образование, работа - языки программирования я не изучал нигде и по работе они мне не нужны. Делать выводы про безголовость ничего не зная про меня - это 5 баллов, спасибо.


"Поиск, проверка наличия подсети в текстовом файле по IP"
Отправлено Виктор , 24-Апр-18 15:45 
> В php я полный 0, вообще представления не имею что да как
> там. Что-то делаю только в bash, немного знаю sed, awk, но
> и тут не мегагуру - иначе не  задавал бы вопросов.
> У меня совершенно другого рода образование, работа - языки программирования я
> не изучал нигде и по работе они мне не нужны. Делать
> выводы про безголовость ничего не зная про меня - это 5
> баллов, спасибо.

Простите, но приведенный код это сплошные арифметические операции... Тут и знать нечего. Максимум, что вам там может быть непонятно, это explode(), pow() и ip2long(), гуглится в 2 минуты.


"Поиск, проверка наличия подсети в текстовом файле по IP"
Отправлено Виктор , 23-Апр-18 14:26 
> Прошу пардона, я совсем не в теме как можно запускать php из
> bash? WEB-сервера у меня нет, только консоль.

Точно так же, как и Perl. PHP в этом плане ничем не отличается.

> И мне нужно проверять file.txt с длинным списком подсетей
> - как его туда подставить? Пример строчки в bash можно?

Я вам дал общий алгоритм разбора подсети и поиска в ней искомого хоста... Адаптация на вас, за бесплатно я вашу работу для вас делать не буду.


"Поиск, проверка наличия подсети в текстовом файле по IP"
Отправлено fantom , 23-Апр-18 12:08 
> Имеется некий IP, пусть будет 8.8.8.8. Имеется текстовый файл с длинным списком
> подсетей с различными длинами префикса, к примеру, /12, /15, /24. Возможно
> ли написать какой-то хитрый grep, который бы проверял есть ли среди
> этих подсетей та, в которую входит нужный нам IP, допустим, упомянутый
> 8.8.8.8/32? Может на Perl-е что-то или ещё на чём? Если кто
> знает, то, просьба, привести пример такого скрипта.

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


"Поиск, проверка наличия подсети в текстовом файле по IP"
Отправлено xm , 23-Апр-18 13:17 
> Имеется некий IP, пусть будет 8.8.8.8. Имеется текстовый файл с длинным списком
> подсетей с различными длинами префикса, к примеру, /12, /15, /24.

Есть CIDR grep (много вариантов). К примеру, https://github.com/mpangrazzi/cidr-grep


"Поиск, проверка наличия подсети в текстовом файле по IP"
Отправлено Филимон Вдумчивый , 23-Апр-18 20:40 
> Имеется некий IP, пусть будет 8.8.8.8. Имеется текстовый файл с длинным списком
> подсетей с различными длинами префикса, к примеру, /12, /15, /24. Возможно

use Net::IPAddress;


foreach my $net (@nets)
{
        if (Net::IPAddress::mask($net->{address}, $net->{mask}) eq Net::IPAddress::mask($address, $net->{mask}))
        {
            
            return 1;
        }
    }

@nets у меня заполняется  push @nets, { address => $address, mask => $mask };

В перле есть и именно создание мегарегулярного выражения
use Net::IP::Match::Regexp qw( create_iprange_regexp match_ip );

$banned_regexp = create_iprange_regexp(@banned);

if (match_ip($address, $banned_regexp))
{
     syslog(LOG_WARNING, "$address is already banned!");
      return 1;
}

но он немного не очень чтобы прямо быстрый слишком


"Поиск, проверка наличия подсети в текстовом файле по IP"
Отправлено михалыч , 29-Апр-18 19:02 
>[оверквотинг удален]
> => $mask };
> В перле есть и именно создание мегарегулярного выражения
> use Net::IP::Match::Regexp qw( create_iprange_regexp match_ip );
> $banned_regexp = create_iprange_regexp(@banned);
> if (match_ip($address, $banned_regexp))
> {
>      syslog(LOG_WARNING, "$address is already banned!");
>       return 1;
> }
> но он немного не очень чтобы прямо быстрый слишком

да можно ещё и Net::Subnet
автор утверждает, что он быстрый

типа так

use strict;
use warnings;
use Net::Subnet;

my $ip_addr = $ARGV[0];
my $ip_file = $ARGV[1];

open my $fh, "<", $ip_file;
chomp (my @farr = <$fh>);
close $fh;

my $rfc = subnet_matcher @farr;

print $rfc->($ip_addr) ? 'yes' : 'no';

но возможно ТС нужно знать, а в какие сети/подсети попадает проверяемый адрес ??


"Поиск, проверка наличия подсети в текстовом файле по IP"
Отправлено михалыч , 30-Апр-18 06:47 
> Имеется некий IP, пусть будет 8.8.8.8. Имеется текстовый файл с длинным списком
> подсетей с различными длинами префикса, к примеру, /12, /15, /24. Возможно
> ли написать какой-то хитрый grep, который бы проверял есть ли среди
> этих подсетей та, в которую входит нужный нам IP, допустим, упомянутый
> 8.8.8.8/32? Может на Perl-е что-то или ещё на чём? Если кто
> знает, то, просьба, привести пример такого скрипта.

да не вопрос! поздновато, конечно, но лучше поздно, чем никогда
может ещё кому-то сгодится
абсолютно бесплатно, без регистрации и смс


#!/usr/bin/perl

use strict;
use warnings;
use Net::CIDR;

my $ip_addr = $ARGV[0];
my $netlist = $ARGV[1];

## проверяем, что на входе?
if (!defined($ARGV[0]) || !defined($ARGV[1])) {
    print "enter\n\targ 1 - ip address\nand\n\targ 2 - path to the network list file\n";
    exit;
}

## проверяем правильность входящего ip-адреса
if ($ip_addr !~ /^((\d|[01]?\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[01]?\d\d|2[0-4]\d|25[0-5])$/) {
    print "enter a valid ip address!\n";
    exit;
}

## читаем файл со списком проверяемых сетей в массив
open my $fh, "<", $netlist or die "couldn't open $netlist for reading: $!\n";
chomp (my @netlist = <$fh>);
close $fh;

## получаем массив подсетей в которые входит проверяемый ip-адрес
my @subnets = Net::CIDR::addr2cidr($ip_addr);

## ищем пересечение полученного массива и массива из файла
my @found;
my %count;
my $net;

for $net (@netlist, @subnets) {$count{$net}++}
for $net (keys %count) {push @found, $net if $count{$net}==2}

## смотрим куда попали )))
if (@found) {print join("\n", @found)}
else {print "NOT FOUND!"}


disclaimer
использование на свой страх и риск
считайте, что вас предупредили ))