perl中的IP地址条件语句

2wnc66cl  于 2023-03-19  发布在  Perl
关注(0)|答案(3)|浏览(187)

我们的系统中有一个Perl脚本,用于验证来自我们组的IP地址。该脚本是由以前的开发人员开发的,我对Perl不太精通。我们有一组IP,这些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),我不想在Unless语句中逐个添加它们,因为这样会很长,不利于编程(我想)。有没有什么方法可以为IP地址添加“小于”或“大于”语句?类似于除非($remoteip〈=“xx.xx.xx.204”AND $远程IP地址〉=“xx.xx.xx.145“)。
谢谢。

kknvjkwl

kknvjkwl1#

把四元数转换成32位整数,你就可以设置了。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
}

例如,111.222.233.244被转换为18768798600x6fdee9f401101111110111101110100111110100),因此您不仅可以比较(排序)地址,还可以对其应用位掩码。

uqjltbpv

uqjltbpv2#

您可以使用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
bzzcjhmw

bzzcjhmw3#

自己处理逻辑并不是一件大事,但正如前面所指出的,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

相关问题