加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:02:59 所属栏目:大数据 来源:网络整理
导读:? ?在linux和FreeBSD系统上,可以通过ifconfig来确认有多少IP,或者有多少网口,也可以通过读取配置文件来获取相关的IP。 ? ? 但是,在不通的系统,网口的命名是不一样的,即使是同样的操作系统,实体机和虚拟机的网卡命名规则也是不一样的,如:CentOS 5.x

? ?在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. {?
  12. ????????foreach?my?$aref(@{$ip_addr->{$interface}})?
  13. ????????{?
  14. ????????????????printf("$interface??$aref->{address}n");?
  15. ????????????????#print?Dumper($aref);?
  16. ????????}?
  17. }?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读