Имеется некий IP, пусть будет 8.8.8.8. Имеется текстовый файл с длинным списком подсетей с различными длинами префикса, к примеру, /12, /15, /24. Возможно ли написать какой-то хитрый grep, который бы проверял есть ли среди этих подсетей та, в которую входит нужный нам IP, допустим, упомянутый 8.8.8.8/32? Может на Perl-е что-то или ещё на чём? Если кто знает, то, просьба, привести пример такого скрипта.
> Имеется некий 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"
}
Прошу пардона, я совсем не в теме как можно запускать php из bash? WEB-сервера у меня
нет, только консоль. И мне нужно проверять file.txt с длинным списком подсетей - как его
туда подставить? Пример строчки в bash можно?
> Прошу пардона, я совсем не в теме как можно запускать php из
> bash? WEB-сервера у меня
> нет, только консоль. И мне нужно проверять file.txt с длинным списком подсетей
> - как его
> туда подставить? Пример строчки в bash можно?Забудьте обо всем этом. в приведенном кусте кода есть несколько опечаток (намеренных? :) что приведет к невозможности его выполнения. И это будет непреодолимым препятствием для вас.
Плюс к тому же этот код- концепт который вам надо дописать по месту...
> Забудьте обо всем этом. в приведенном кусте кода есть несколько опечаток (намеренных?
> :) что приведет к невозможности его выполнения. И это будет непреодолимым
> препятствием для вас.
> Плюс к тому же этот код- концепт который вам надо дописать по
> месту...Не специально. Я взял старый кусок и немного дорисовал до его задач... Ну да, пропустил несколько ";"... Я ж не думал, что он настолько безголовый, что имея код, разложенный по полочкам и не сможет разобраться.
> Не специально. Я взял старый кусок и немного дорисовал до его задач...
> Ну да, пропустил несколько ";"... Я ж не думал, что он
> настолько безголовый, что имея код, разложенный по полочкам и не сможет
> разобраться.В php я полный 0, вообще представления не имею что да как там. Что-то делаю только в bash, немного знаю sed, awk, но и тут не мегагуру - иначе не задавал бы вопросов. У меня совершенно другого рода образование, работа - языки программирования я не изучал нигде и по работе они мне не нужны. Делать выводы про безголовость ничего не зная про меня - это 5 баллов, спасибо.
> В php я полный 0, вообще представления не имею что да как
> там. Что-то делаю только в bash, немного знаю sed, awk, но
> и тут не мегагуру - иначе не задавал бы вопросов.
> У меня совершенно другого рода образование, работа - языки программирования я
> не изучал нигде и по работе они мне не нужны. Делать
> выводы про безголовость ничего не зная про меня - это 5
> баллов, спасибо.Простите, но приведенный код это сплошные арифметические операции... Тут и знать нечего. Максимум, что вам там может быть непонятно, это explode(), pow() и ip2long(), гуглится в 2 минуты.
> Прошу пардона, я совсем не в теме как можно запускать php из
> bash? WEB-сервера у меня нет, только консоль.Точно так же, как и Perl. PHP в этом плане ничем не отличается.
> И мне нужно проверять file.txt с длинным списком подсетей
> - как его туда подставить? Пример строчки в bash можно?Я вам дал общий алгоритм разбора подсети и поиска в ней искомого хоста... Адаптация на вас, за бесплатно я вашу работу для вас делать не буду.
> Имеется некий IP, пусть будет 8.8.8.8. Имеется текстовый файл с длинным списком
> подсетей с различными длинами префикса, к примеру, /12, /15, /24. Возможно
> ли написать какой-то хитрый grep, который бы проверял есть ли среди
> этих подсетей та, в которую входит нужный нам IP, допустим, упомянутый
> 8.8.8.8/32? Может на Perl-е что-то или ещё на чём? Если кто
> знает, то, просьба, привести пример такого скрипта.IP - суть 32 битное число, сеть - диапазон чисел.
проверяете попадание числа в диапазон.....
awk вам в помощь.
> Имеется некий IP, пусть будет 8.8.8.8. Имеется текстовый файл с длинным списком
> подсетей с различными длинами префикса, к примеру, /12, /15, /24.Есть CIDR grep (много вариантов). К примеру, https://github.com/mpangrazzi/cidr-grep
> Имеется некий 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;
}но он немного не очень чтобы прямо быстрый слишком
>[оверквотинг удален]
> => $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, пусть будет 8.8.8.8. Имеется текстовый файл с длинным списком
> подсетей с различными длинами префикса, к примеру, /12, /15, /24. Возможно
> ли написать какой-то хитрый grep, который бы проверял есть ли среди
> этих подсетей та, в которую входит нужный нам IP, допустим, упомянутый
> 8.8.8.8/32? Может на Perl-е что-то или ещё на чём? Если кто
> знает, то, просьба, привести пример такого скрипта.да не вопрос! поздновато, конечно, но лучше поздно, чем никогда
может ещё кому-то сгодится
абсолютно бесплатно, без регистрации и смс
#!/usr/bin/perluse 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
использование на свой страх и риск
считайте, что вас предупредили ))