通过perl获取系统使用的IP和网口

   在linux和FreeBSD系统上,可以通过ifconfig来确认有多少IP,或者有多少网口,也可以通过读取配置文件来获取相关的IP。

    但是,在不通的系统,网口的命名是不一样的,即使是同样的操作系统,实体机和虚拟机的网卡命名规则也是不一样的,如:CentOS 5.x的命名规则是ethx,而在CentOS 6.x,命名规则则是emx;FreeBSD上也有re0和bce0的命令区分。

     所以,如果要按照读取配置文件的方式或者利用ifconfig命令来获取的话,那么过滤规则就会有多个,不太方便。

     利用perl的模块,可以省略很多的操作。

  
  
  
  
  1. #!/usr/bin/perl -w 
  2. use strict; 
  3. use Sys::HostAddr; 
  4. use Data::Dumper; 
  5.  
  6. my $sysaddr=Sys::HostAddr->new(); 
  7.  
  8. my $ip_addr=$sysaddr->ip(); 
  9. #print Dumper($ip_addr); 
  10. foreach my $interface(keys %{$ip_addr}) 
  11.         foreach my $aref(@{$ip_addr->{$interface}}) 
  12.         { 
  13.                 printf("$interface  $aref->{address}\n"); 
  14.                 #print Dumper($aref); 
  15.         } 

  对于$ip_addr是一个hash,其结构如下图:

   而对于同一张网卡有多个IP的,其hash结构如下图:

   网卡名作为key存在hash体里,而value则是一个匿名的数组,数组只有一个元素,这个元素是一个匿名的hash,这个hash里有2个key,对应的value分别是netmask和address。

   程序里有两个foreach,第一个foreach得到的是网卡名,而第二个foreach里的列表变量是一个匿名的数组,而数组的值是匿名的hash。

  
  
  
  
  1. $ip_addr->{$interface};

   由于这个数组只有一个值,所以,这个也是数组里匿名hash的引用。

   如果单张网卡上有多个IP的话,也能这么来取值,先通过下面的结构来看看

  
  
  
  
  1. print Dumper(@{$ip_addr->{$interface}})  if($interface =~ /bce1/m); 

   上面语句只将bec1的数据结构打印出来,如下图:

  可以看到,是两个hash,这样对于同一个网卡有多个IP的,可以采取同样的方式来取得所有的值。

 

 

 

 

 

 

 

 

 

 


你可能感兴趣的:(perl,hash,获取系统IP)