用perl获取linux,unix,windows平台ip的程序

#/perl/bin/perl
use warnings;
use strict;
use Socket;
use Sys::Hostname;
sub get_serip() {
my $host = hostname();
my $name;
my $aliases;
my $type;
my $len;
my @thisaddr;
my $ip;
( $name, $aliases, $type, $len, @thisaddr ) = gethostbyname($host);
foreach (@thisaddr) {
$ip = inet_ntoa($_);
}
return $ip;
}

print &get_serip();

上面这个是跨平台的,但是要安装额外的perl模块,不过一般版本稍高些的perl都已经安装了。

下面这个是用linux的命令ifconfig,然后借助郑则表示获取ip的程序,程序的功能要强大些


use warnings;
use strict;
my $ser_ip;
my @output = `ifconfig 2>&1`;
foreach (@output) {
if (/^\s*inet addr:([\d\.]*)\s*Bcast:([\d\.]*)\s*Mask:([\d\.]*)/) {
$ser_ip = $1;
}
}
#################功能复杂
#!/usr/bin/perl
use strict;


#use warnings;


#筛选出非内网的ip
my @ip;
open (IN, "/sbin/ifconfig |");
while (<IN>) {
    if ( /^\s*inet addr:([\d\.]*)\s*Bcast:([\d\.]*)\s*Mask:([\d\.]*)/ ) {
        if ( ( $1 !~ /(^192\.168\.[\d\.]*)/ ) && ( $1 !~ /(^10\.[\d\.]*)/ ) && ( $1 !~ /(^172\.(16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)\.[\d\.]*)/ ) ) {
            push @ip,$1;
            }
    }
}
close(IN);
#过滤重复ip
@ip=sort @ip;
my %count=();
my @ip = grep {++$count{$_} < 2} @ip;
if ($#ip > 0) {
    my $k=1;
    for(my $i=0;$i<=$#ip;$i++) {
       # my($j1,$j2,$j3,$j4)=();
       # my($k1,$k2,$k3,$k4)=();
       my ($j1,$j2,$j3,$j4)=split /\./,$ip[$i];
       my ($k1,$k2,$k3,$k4)=split /\./,$ip[$k];
        if ( $j1 ne $k1 ) {
            last;
        }
        if ( ($j1 eq $k1) && ($j2 eq $k2) ) {
            shift @ip;
        }
    $k++;
    }
}
#如果ip只有1个就直接上报
if ($#ip == 0 ) {
    foreach my $tmp(@ip){
    print "$tmp ";
    exit 0;
    }
}
#            @ip=($ip[1],$ip[0]);
#如果ip有2个,进行排序,先网通,后电信.
if ($#ip == 1 ) {
    my $ip1=readpipe("whois $ip[0]\@whois.apnic.net | sed -e '/./{H;\$!d;}' -e  'x;/netnum/!d' |grep ^netname | awk '{print \$2}'|awk -F- '{print \$1}'");
    my $ip2=readpipe("whois $ip[1]\@whois.apnic.net | sed -e '/./{H;\$!d;}' -e  'x;/netnum/!d' |grep ^netname | awk '{print \$2}'|awk -F- '{print \$1}'");
    chomp($ip1);
    chomp($ip2);
    #print $ip1,"\n";
    #print $ip2,"\n";
    if (  ($ip1 =~ /CHINATELECOM/) || ($ip1 =~ /CHINANET/) ||  ($ip2 =~ /CNC/) || ($ip2 =~ /CNCGROUP/) || ($ip2 =~ /UNICOM/) ) {
        #print "1 normal double line\n";
        @ip=($ip[1],$ip[0]);
        }
    if ( ( ($ip1 =~ /CNC/) || ($ip1 =~ /CNCGROUP/) || ($ip1 =~ /UNICOM/) ) && ( ($ip2 =~ /CNC/) || ($ip2 =~ /CNCGROUP/) || ($ip2 =~ /UNICOM/) ) ) {
        #print "2 double cnc line\n";
        @ip=();
        }
    if ( ( ($ip1 =~ /CHINATELECOM/) || ($ip1 =~ /CHINANET/) ) && ( ($ip2 =~ /CHINATELECOM/) || ($ip2 =~ /CHINANET/) ) ) {
        #print "3 double tel line\n";
        @ip=();
        }
    foreach my $tmp(@ip){
        print "$tmp ";
    }
    exit 0;
}
#如果大于2个就退出.
if ( $#ip >= 2 ) {
    @ip=();
    die('@ip >= 2');
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值