The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Поиск, проверка наличия подсети в текстовом файле по IP"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на рабочей станции (Консоль / Linux)
Изначальное сообщение [ Отслеживать ]

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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Поиск, проверка наличия подсети в текстовом файле по IP"  +/
Сообщение от Виктор (??) on 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"
}

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Поиск, проверка наличия подсети в текстовом файле по IP"  +/
Сообщение от Seryoga2014 (ok) on 23-Апр-18, 10:55 
Прошу пардона, я совсем не в теме как можно запускать php из bash? WEB-сервера у меня
нет, только консоль. И мне нужно проверять file.txt с длинным списком подсетей - как его
туда подставить? Пример строчки в bash можно?
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

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

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

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

9. "Поиск, проверка наличия подсети в текстовом файле по IP"  +/
Сообщение от Филимон Вдумчивый on 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;
}

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

12. "Поиск, проверка наличия подсети в текстовом файле по IP"  +/
Сообщение от михалыч (ok) on 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';

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

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

13. "Поиск, проверка наличия подсети в текстовом файле по IP"  +/
Сообщение от михалыч (ok) on 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
использование на свой страх и риск
считайте, что вас предупредили ))
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру