工作总结--ip地址在perl中的各类应用

来源:互联网 发布:程序员的贡献 编辑:程序博客网 时间:2024/06/08 06:25

1.1.1.1 255.255.255.252 => 1.1.1.1/30:

my ($ip,$mask)= @_;$mask = sprintf("%b%b%b%b",(split /\./, $mask));my $temp = $mask =~ s/1/1/g;$temp = 0 if(!defined $temp || $temp eq '');my $maskip = $ip."/".$temp;return ($maskip);

1.1.1.1/30 => 1.1.1.1 255.255.255.252:

my ($maskip) = @_;my ($ip, $mask) = split m{/}xms, $maskip;$maskip = $ip.' '.join '.', unpack 'C*', pack 'B32', 1 x $mask;return ($maskip);


根据掩码获取起始和终止ip地址(网络和广播):

my ($ip,$mask) = @_;my $bin_ip;my $bin_mask;map { $bin_ip .= substr(unpack("B32",pack("N",$_)) , -8);} split (/\./,$ip);map { $bin_mask .= substr(unpack("B32",pack("N",$_)) , -8);} split (/\./,$mask);my $hostipbbit = 32 - index($bin_mask,"0");return 0 if($hostipbbit >= 32);my $network = $bin_ip & $bin_mask;my $convnetwork=oct('0b'.$network);my $startconvip = $convnetwork;my $endconvip = $convnetwork+2**$hostipbbit-1;my $bin_startip = unpack("B32",pack("N",$startconvip));$startip = sprintf ("%d.%d.%d.%d",oct('0b'.substr($bin_startip,0,8)),oct('0b'.substr($bin_startip,8,8)),oct('0b'.substr($bin_startip,16,8)),oct('0b'.substr($bin_startip,24)));my $bin_endip = unpack("B32",pack("N",$endconvip));$endip = sprintf ("%d.%d.%d.%d",oct('0b'.substr($bin_endip,0,8)),oct('0b'.substr($bin_endip,8,8)),oct('0b'.substr($bin_endip,16,8)),oct('0b'.substr($bin_endip,24)));return ($startip,$endip);

设备ACl转换ip映射:
1、
acl extend number 100
  rule 2 permit ip any  18.8.2.92 0.0.0.3
  rule 3 permit ip any  18.8.2.48 0.0.0.7
  rule 4 permit ip any  18.8.2.08 0.0.0.7
  rule 5 permit ip any  18.8.2.16 0.0.0.7
2、
access-list 121 permit ip 60.3.9.1 0.0.0.7 any

sub Ip_ACL{    my ($aclno,$ip,$any,$Ref,$rule) = @_; #rule可有可无    my $any_bin = sprintf("%08b%08b%08b%08b", ( split /\./, $any));    my $ip_bin = sprintf("%08b%08b%08b%08b", ( split /\./, $ip));    my $Tmp_bin = sprintf("%32b", (oct("0b".$any_bin) ^ (2**32)));    my $hostipbbit = 32 - index($Tmp_bin,"0");    if($hostipbbit >= 32)    {        if($rule ne '')        {            $Ref->{$ip}{'Role'} = $rule;            &Debug("$ip Role: $Ref->{$ip}{'Role'} \n", 0);        }        $Ref->{$ip}{'AclSeq'} = $aclno;        &Debug("$ip AclSeq: $Ref->{$ip}{'AclSeq'} \n", 0);        return 0;    }    my $network = $ip_bin & $Tmp_bin;    my $convnetwork=oct('0b'.$network);    my $i = 0;    for ($i; $i < 2**$hostipbbit; $i ++)    {        my $convip = $convnetwork+$i;        my $bin_startip = unpack("B32",pack("N",$convip));        $ip = sprintf ("%d.%d.%d.%d",oct('0b'.substr($bin_startip,0,8)),oct('0b'.substr($bin_startip,8,8)),oct('0b'.substr($bin_startip,16,8)),oct('0b'.substr($bin_startip,24)));        if($rule ne '')        {            $Ref->{$ip}{'Role'} = $rule;            &Debug("$ip Role: $Ref->{$ip}{'Role'} \n", 0);        }        $Ref->{$ip}{'AclSeq'} = $aclno;        &Debug("$ip AclSeq: $Ref->{$ip}{'AclSeq'} \n", 0);    }    return 0;}

获取全部ip:

sub Ip_ANY{    my ($ip,$mask,$Ref,$para2) = @_;    my ($bin_ip,$bin_mask);    map {$bin_ip .= substr(unpack("B32",pack("N",$_)) , -8);} split (/\./,$ip);    map {$bin_mask .= substr(unpack("B32",pack("N",$_)) , -8);} split (/\./,$mask);    my $binwork = $bin_ip & $bin_mask;    my $convnetwork=oct('0b'.$binwork);    my $hostipbbit = 32 - index($bin_mask,"0");    return 0 if($hostipbbit > 10);    my $i = 0;    for ($i; $i < 2**$hostipbbit; $i ++)    {        my $convip = $convnetwork+$i;        my $bin_startip = unpack("B32",pack("N",$convip));        $ip = sprintf ("%d.%d.%d.%d",oct('0b'.substr($bin_startip,0,8)),oct('0b'.substr($bin_startip,8,8)),oct('0b'.substr($bin_startip,16,8)),oct('0b'.substr($bin_startip,24)));        $Ref->{$ip} = $para2;        &Debug("$ip IP: $Ref->{$ip} \n", 0);    }    return 0;}