我们的系统中有一个perl脚本,用于验证我们组中的IP地址。这是由以前的开发人员开发的,我不熟悉perl。我们有一组IP硬编码并在执行操作之前进行检查。这是代码片段(示例)
unless ($remoteip eq "some ip" || $remoteip eq "some IP" || $remoteip eq "xx.xx.xx.xx" )
现在我想添加另外50个范围内的IP地址(xx.xx.xx.145到xx.xx.xx.204) 我不想在除非语句中逐一添加它们,因为这将是冗长的并且不适合编程(我认为)。有什么办法我可以为IP地址添加Less that或gratethen声明吗?比较类似于($ remoteip< =“xx.xx.xx.204”和$ remoteip> =“xx.xx.xx.145”)。
感谢。
答案 0 :(得分:2)
将四元组转换为整数并进行设置。 CPAN上有一些模块会为你做这件事,但归结为这样的事情
sub ip2dec ($) {
unpack N => pack CCCC => split /\./ => shift;
}
if (ip2dec($remoteip) <= ip2dec('xx.xx.xx.204') && ip2dec($remoteip) >= ip2dec('xx.xx.xx.145')) {
# do something
}
答案 1 :(得分:0)
您可以将Socket模块与inet_aton方法一起使用,并将范围转换为数组并通过它进行grep。
use v5.16;
use strict;
use warnings;
use Socket qw/inet_aton/;
#using 10.210.14 as the first three octects
#convert range into binary
my @addressrange = map {unpack('N',inet_aton("10.210.14.$_"))} (145..204);
#address to test
my $address = $ARGV[0];
#grep for this binary in the range
unless(grep {unpack('N',inet_aton($address)) eq $_} @addressrange) {
say "Address not part of the range"
}
else {
say "Address is part of the range"
}
然后运行
perl iphelp.pl 10.210.14.15
Address not part of the range
perl iphelp.pl 10.210.14.145
Address is part of the range
答案 2 :(得分:0)
自己处理逻辑并不是什么大不了的事,但正如已经指出的那样,还有CPAN模块可以为你做这件事。在这种情况下,我缩短了输出范围的长度:
use strict;
use warnings;
use feature qw( say );
use Net::Works::Address;
my $lower = Net::Works::Address->new_from_string( string => '10.0.0.145' );
my $upper = Net::Works::Address->new_from_string( string => '10.0.0.150' );
foreach my $i ( 0 .. 255 ) {
my $ip = '10.0.0.' . $i;
my $auth = check_ip( $ip );
say "$ip is OK" if $auth;
}
sub check_ip {
my $ip = shift;
my $address = Net::Works::Address->new_from_string( string => $ip );
return ( $address <= $upper && $address >= $lower );
}
输出是:
10.0.0.145 is ok
10.0.0.146 is ok
10.0.0.147 is ok
10.0.0.148 is ok
10.0.0.149 is ok
10.0.0.150 is ok