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');
}