Как создать допустимые диапазоны IP-адресов с учетом IP-адреса и маски подсети в Perl? - PullRequest
3 голосов
/ 15 ноября 2009

Как мне создать действительные диапазоны IP-адресов с учетом IP-адреса и маски подсети в Perl? Я понимаю концепцию генерации диапазонов IP-адресов, но мне нужна помощь в написании на Perl. Например, если я И IP-адрес и маска подсети, я получу номер подсети. Добавление 1 к этому номеру должно дать мне первый действительный IP. Если я инвертирую маску подсети и ИЛИ с номером подсети, я должен получить широковещательный адрес. Вычитание 1 из него должно дать последний действительный IP-адрес.

Ответы [ 4 ]

3 голосов
/ 16 ноября 2009

Если вы хотите поиграть с побитовыми операторами самостоятельно, это становится так:

#!/usr/bin/perl
use strict;
use warnings;
use Socket;

my $ip_address = '192.168.0.15';
my $netmask = 28;

my $ip_address_binary = inet_aton( $ip_address );
my $netmask_binary    = ~pack("N", (2**(32-$netmask))-1);

my $network_address    = inet_ntoa( $ip_address_binary & $netmask_binary );
my $first_valid        = inet_ntoa( pack( 'N', unpack('N', $ip_address_binary & $netmask_binary ) + 1 ));
my $last_valid         = inet_ntoa( pack( 'N', unpack('N', $ip_address_binary | ~$netmask_binary ) - 1 ));
my $broadcast_address  = inet_ntoa( $ip_address_binary | ~$netmask_binary );

print $network_address, "\n";
print $first_valid, "\n";
print $last_valid, "\n";
print $broadcast_address, "\n";

exit;

С Net :: Netmask легче понять:

#!/usr/bin/perl
use strict;
use warnings;
use Net::Netmask;

my $ip_address = '192.168.0.15';
my $netmask = 28;

my $block = Net::Netmask->new( "$ip_address/$netmask" );

my $network_address    = $block->base();
my $first_valid        = $block->nth(1);
my $last_valid         = $block->nth( $block->size - 2 );
my $broadcast_address  = $block->broadcast();

print $network_address, "\n";
print $first_valid, "\n";
print $last_valid, "\n";
print $broadcast_address, "\n";

exit;
3 голосов
/ 15 ноября 2009

См. perldoc perlop для получения информации о побитовых операторах (они такие же, как в большинстве других C-подобных языков):

  • & поразрядно И
  • | поразрядно ИЛИ
  • ^ поразрядно XOR
  • >> смещено вправо
  • << влево

Однако, если вы действительно хотите поработать с сетевыми блоками и IP-адресами (в отличие от простого ответа на домашнее задание - хотя мне любопытно, какой курс вы выбрали бы, используя Perl), вы можете избежать повторного изобретения колесо, повернув к CPAN:

0 голосов
/ 27 января 2018

Следующий фрагмент может помочь вам найти IP-адрес и маску подсети на rhel7

my $ip=`hostname -i`;
my $subnet = `ip addr show|grep -i ".*${ip}/.*"|tail -1|cut -d "/" -f2|cut -d " " -f1`;
0 голосов
/ 15 ноября 2009

Быстрый и грязный способ найти маску подсети:

use Socket;
my $subnet_mask = inet_ntoa(inet_aton($ip_str) & inet_aton($mask_str)):
...