perl中的IP地址条件语句

时间:2014-01-14 17:18:23

标签: perl ip-address conditional-statements

我们的系统中有一个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”)。

感谢。

3 个答案:

答案 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