python netifaces库
在系统运维等过程中,网络永远是离不开的话题。网络中比较基础的是网络接口,每个网络接口都有一个名字,并且有它的ip地址,还有关于从这个接口出去的包的路由。我们可以把网络接口看作个数据模型,每个数据模型基本上有增删改查四种基本操作,下面我们就从网络接口这个数据模型的查引入netifaces这个python库。
提到linux网络,我们不得不提下大名鼎鼎的iproute2这个rpm包,因为这个包里有非常好用的ip命令。那我们提出三个问题,依次通过ip和python netifaces分别来实现,来实现引言里面的查操作。
- 如何查看当前机器有哪些网络接口。
- 如何根据网络接口名字来获取ip地址
- 获取路由。
如何获取当前系统的网络接口名字
Linux
ip link show 可以显示当前网络接口的信息, 在下面的示例中lo和ens33就是网络接口的名字。
Python netifaces
python netifaces提供了函数interfaces用于返回所有接口的名字的列表。
通过接口名字获取该接口的IP 地址
Linux
获取lo口的ip地址
获取所有网络接口的IP地址
Python
获取lo口的ip 地址
返回值的解释:
类型: 字典
key值:就是netifaces.address_families中映射中的值,比如上例中的17,对应的是AF_PACKET,2就是AF_INET也就是IPV4,10代表的就是AF_INET6就是IPV6
要取lo的第一个ipv4地址,直接ioAddr[2][0]['addr']
获取所有端口的ip地址
获取路由
Linux
Python
netifaces使用gateways函数获取路由
这里返回的是个字典,其中有一项是‘default'指明这个记录是默认路由信息。
其他是根据类型返回的路由信息:
key值是类型,2代表AF_INET
元组记录
192.168.124.1 路由地址
ens33 接口名字
True 是否是默认路由
Linux
ip link show 可以显示当前网络接口的信息, 在下面的示例中lo和ens33就是网络接口的名字。
点击(此处)折叠或打开
- [root@localhost ~]# ip link show
- 1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- 2: ens33: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
- link/ether 00:0c:29:b0:7e:fd brd ff:ff:ff:ff:ff:ff
python netifaces提供了函数interfaces用于返回所有接口的名字的列表。
点击(此处)折叠或打开
- In [1]: import netifaces
- In [2]: ifnames = netifaces.interfaces()
- In [3]: print(ifnames)
- ['lo', 'ens33']
Linux
获取lo口的ip地址
点击(此处)折叠或打开
- [root@localhost ~]# ip addr show dev lo
- 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- inet 127.0.0.1/8 scope host lo
- valid_lft forever preferred_lft forever
- inet6 ::1/128 scope host
- valid_lft forever preferred_lft forever
点击(此处)折叠或打开
- [root@localhost ~]# ip addr show
- 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- inet 127.0.0.1/8 scope host lo
- valid_lft forever preferred_lft forever
- inet6 ::1/128 scope host
- valid_lft forever preferred_lft forever
- 2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
- link/ether 00:0c:29:b0:7e:fd brd ff:ff:ff:ff:ff:ff
- inet 192.168.124.9/24 brd 192.168.124.255 scope global noprefixroute dynamic ens33
- valid_lft 76786sec preferred_lft 76786sec
- inet6 fe80::1ece:a138:adbd:aa45/64 scope link noprefixroute
- valid_lft forever preferred_lft forever
获取lo口的ip 地址
使用netifaces获取接口ip地址非常简单,直接使用ifaddresses,传入参数是接口的名字,返回值是一个列表。
点击(此处)折叠或打开
- In [4]: loAddr = netifaces.ifaddresses('lo')
- In [5]: print(loAddr)
- {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
点击(此处)折叠或打开
- In [6]: print(netifaces.address_families)
- {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'}
获取所有端口的ip地址
点击(此处)折叠或打开
- In [7]: for name in ifnames:
- ...: ipAddr = netifaces.ifaddresses(name)
- ...: print(ipAddr)
- ...:
- {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'}]}
- {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
点击(此处)折叠或打开
- [root@localhost ~]# ip route show
- default via 192.168.124.1 dev ens33 proto dhcp metric 100
- 192.168.124.0/24 dev ens33 proto kernel scope link src 192.168.124.9 metric 100
netifaces使用gateways函数获取路由
点击(此处)折叠或打开
- In [8]: routes = netifaces.gateways()
- In [9]: routes
- Out[9]:
- {'default': {2: ('192.168.124.1', 'ens33')},
- 2: [('192.168.124.1', 'ens33', True)]}
其他是根据类型返回的路由信息:
key值是类型,2代表AF_INET
元组记录
192.168.124.1 路由地址
ens33 接口名字
True 是否是默认路由