在linux和FreeBSD系统上,可以通过ifconfig来确认有多少IP,或者有多少网口,也可以通过读取配置文件来获取相关的IP。
但是,在不通的系统,网口的命名是不一样的,即使是同样的操作系统,实体机和虚拟机的网卡命名规则也是不一样的,如:CentOS 5.x的命名规则是ethx,而在CentOS 6.x,命名规则则是emx;FreeBSD上也有re0和bce0的命令区分。
所以,如果要按照读取配置文件的方式或者利用ifconfig命令来获取的话,那么过滤规则就会有多个,不太方便。
利用perl的模块,可以省略很多的操作。
- #!/usr/bin/perl -w
- use strict;
- use Sys::HostAddr;
- use Data::Dumper;
- my $sysaddr=Sys::HostAddr->new();
- my $ip_addr=$sysaddr->ip();
- #print Dumper($ip_addr);
- foreach my $interface(keys %{$ip_addr})
- {
- foreach my $aref(@{$ip_addr->{$interface}})
- {
- printf("$interface $aref->{address}\n");
- #print Dumper($aref);
- }
- }
对于$ip_addr是一个hash,其结构如下图:
而对于同一张网卡有多个IP的,其hash结构如下图:
网卡名作为key存在hash体里,而value则是一个匿名的数组,数组只有一个元素,这个元素是一个匿名的hash,这个hash里有2个key,对应的value分别是netmask和address。
程序里有两个foreach,第一个foreach得到的是网卡名,而第二个foreach里的列表变量是一个匿名的数组,而数组的值是匿名的hash。
- $ip_addr->{$interface};
由于这个数组只有一个值,所以,这个也是数组里匿名hash的引用。
如果单张网卡上有多个IP的话,也能这么来取值,先通过下面的结构来看看
- print Dumper(@{$ip_addr->{$interface}}) if($interface =~ /bce1/m);
上面语句只将bec1的数据结构打印出来,如下图:
可以看到,是两个hash,这样对于同一个网卡有多个IP的,可以采取同样的方式来取得所有的值。
转载于:https://blog.51cto.com/zoufuxing/1050661