如果在Perl中给定IP地址和子网掩码,如何创建有效的IP范围?我理解生成IP范围的概念,但需要在Perl中编写帮助。例如,如果我和IP地址和子网掩码我得到子网号。在这个数字上加1应该给我第一个有效的IP。如果我将子网掩码和OR与子网号反转,我应该得到广播地址。从中减去1应该给出最后一个有效的IP地址。
答案 0 :(得分:3)
有关按位运算符的信息,请参阅perldoc perlop(它们与大多数其他类C语言相同):
&
是按位AND |
是按位OR ^
是按位XOR >>
是右移<<
左移但是,如果你真的想用网络块和IP地址做一些工作(而不是简单地回答家庭作业 - 虽然我很好奇你使用Perl的课程),你可以避免重新发明转向CPAN的车轮:
答案 1 :(得分:3)
如果您想自己使用按位运算符,它就变成了:
#!/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;
答案 2 :(得分:0)
快速&amp;找到子网掩码的脏方法:
use Socket;
my $subnet_mask = inet_ntoa(inet_aton($ip_str) & inet_aton($mask_str)):
答案 3 :(得分:0)
以下代码段可以帮助您在rhel7上找到IP地址和子网掩码
my $ip=`hostname -i`;
my $subnet = `ip addr show|grep -i ".*${ip}/.*"|tail -1|cut -d "/" -f2|cut -d " " -f1`;