python netifaces库

    在系统运维等过程中,网络永远是离不开的话题。网络中比较基础的是网络接口,每个网络接口都有一个名字,并且有它的ip地址,还有关于从这个接口出去的包的路由。我们可以把网络接口看作个数据模型,每个数据模型基本上有增删改查四种基本操作,下面我们就从网络接口这个数据模型的查引入netifaces这个python库。
    提到linux网络,我们不得不提下大名鼎鼎的iproute2这个rpm包,因为这个包里有非常好用的ip命令。那我们提出三个问题,依次通过ip和python netifaces分别来实现,来实现引言里面的查操作。

  1. 如何查看当前机器有哪些网络接口。
  2. 如何根据网络接口名字来获取ip地址
  3.   获取路由。
如何获取当前系统的网络接口名字
Linux
ip link show 可以显示当前网络接口的信息, 在下面的示例中lo和ens33就是网络接口的名字。

点击(此处)折叠或打开

  1. [root@localhost ~]# ip link show
  2. 1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. 2: ens33: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
  5. link/ether 00:0c:29:b0:7e:fd brd ff:ff:ff:ff:ff:ff
Python netifaces
python netifaces提供了函数interfaces用于返回所有接口的名字的列表。

点击(此处)折叠或打开

  1. In [1]: import netifaces

  2. In [2]: ifnames = netifaces.interfaces()

  3. In [3]: print(ifnames)
  4. ['lo', 'ens33']
通过接口名字获取该接口的IP 地址
Linux
获取lo口的ip地址

点击(此处)折叠或打开

  1. [root@localhost ~]# ip addr show dev lo
  2. 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. inet6 ::1/128 scope host
  7. valid_lft forever preferred_lft forever
获取所有网络接口的IP地址

点击(此处)折叠或打开

  1. [root@localhost ~]# ip addr show
  2. 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. inet6 ::1/128 scope host
  7. valid_lft forever preferred_lft forever
  8. 2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  9. link/ether 00:0c:29:b0:7e:fd brd ff:ff:ff:ff:ff:ff
  10. inet 192.168.124.9/24 brd 192.168.124.255 scope global noprefixroute dynamic ens33
  11. valid_lft 76786sec preferred_lft 76786sec
  12. inet6 fe80::1ece:a138:adbd:aa45/64 scope link noprefixroute
  13. valid_lft forever preferred_lft forever
Python
获取lo口的ip 地址

使用netifaces获取接口ip地址非常简单,直接使用ifaddresses,传入参数是接口的名字,返回值是一个列表。

点击(此处)折叠或打开

  1. In [4]: loAddr = netifaces.ifaddresses('lo')

  2. In [5]: print(loAddr)
  3. {17: [{'addr': '00:00:00:00:00:00', 'peer': '00:00:00:00:00:00'}], 2: [{'addr': '127.0.0.1', 'netmask': '255.0.0.0', 'peer': '127.0.0.1'}], 10: [{'addr': '::1', 'netmask': 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'}]}
返回值的解释:
类型: 字典
key值:就是netifaces.address_families中映射中的值,比如上例中的17,对应的是AF_PACKET,2就是AF_INET也就是IPV4,10代表的就是AF_INET6就是IPV6

点击(此处)折叠或打开

  1. In [6]: print(netifaces.address_families)
  2. {0: 'AF_UNSPEC', 1: 'AF_FILE', 2: 'AF_INET', 3: 'AF_AX25', 22: 'AF_SNA', 12: 'AF_DECnet', 5: 'AF_APPLETALK', 16: 'AF_NETLINK', 17: 'AF_PACKET', 4: 'AF_IPX', 10: 'AF_INET6', 13: 'AF_NETBEUI', 8: 'AF_ATMPVC', 20: 'AF_ATMSVC', 23: 'AF_IRDA', 6: 'AF_NETROM', 7: 'AF_BRIDGE', 9: 'AF_X25', 11: 'AF_ROSE', 14: 'AF_SECURITY', 15: 'AF_KEY', 18: 'AF_ASH', 19: 'AF_ECONET', 24: 'AF_PPPOX', 25: 'AF_WANPIPE', 31: 'AF_BLUETOOTH'}
要取lo的第一个ipv4地址,直接ioAddr[2][0]['addr']

获取所有端口的ip地址


点击(此处)折叠或打开

  1. In [7]: for name in ifnames:
  2.    ...: ipAddr = netifaces.ifaddresses(name)
  3.    ...: print(ipAddr)
  4.    ...:
  5. {17: [{'addr': '00:00:00:00:00:00', 'peer': '00:00:00:00:00:00'}], 2: [{'addr': '127.0.0.1', 'netmask': '255.0.0.0', 'peer': '127.0.0.1'}], 10: [{'addr': '::1', 'netmask': 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'}]}
  6. {17: [{'addr': '00:0c:29:b0:7e:fd', 'broadcast': 'ff:ff:ff:ff:ff:ff'}], 2: [{'addr': '192.168.124.9', 'netmask': '255.255.255.0', 'broadcast': '192.168.124.255'}], 10: [{'addr': 'fe80::1ece:a138:adbd:aa45%ens33', 'netmask': 'ffff:ffff:ffff:ffff::/64'}]}

获取路由

Linux

点击(此处)折叠或打开

  1. [root@localhost ~]# ip route show
  2. default via 192.168.124.1 dev ens33 proto dhcp metric 100
  3. 192.168.124.0/24 dev ens33 proto kernel scope link src 192.168.124.9 metric 100
Python
netifaces使用gateways函数获取路由

点击(此处)折叠或打开

  1. In [8]: routes = netifaces.gateways()

  2. In [9]: routes
  3. Out[9]:
  4. {'default': {2: ('192.168.124.1', 'ens33')},
  5.  2: [('192.168.124.1', 'ens33', True)]}
这里返回的是个字典,其中有一项是‘default'指明这个记录是默认路由信息。
其他是根据类型返回的路由信息:
key值是类型,2代表AF_INET
元组记录
192.168.124.1 路由地址
ens33  接口名字
True 是否是默认路由

summary

netiface是一个非常简单的库,为我们提供了几个简单的功能,一个是获取网络接口的名字,一个根据接口名字获取ip地址,获取路由信息。




10-07 15:37