friendlessstar 发表于 2018-8-31 09:45:48

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

  在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的,可以采取同样的方式来取得所有的值。
  



页: [1]
查看完整版本: 通过perl获取系统使用的IP和网口