python netifaces库
在系统运维等过程中,网络永远是离不开的话题。网络中比较基础的是网络接口,每个网络接口都有一个名字,并且有它的ip地址,还有关于从这个接口出去的包的路由。我们可以把网络接口看作个数据模型,每个数据模型基本上有增删改查四种基本操作,下面我们就从网络接口这个数据模型的查引入netifaces这个python库。
提到linux网络,我们不得不提下大名鼎鼎的iproute2这个rpm包,因为这个包里有非常好用的ip命令。那我们提出三个问题,依次通过ip和python netifaces分别来实现,来实现引言里面的查操作。
-
如何查看当前机器有哪些网络接口。
-
如何根据网络接口名字来获取ip地址
-
获取路由。
如何获取当前系统的网络接口名字
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
python netifaces提供了函数interfaces用于返回所有接口的名字的列表。
-
In [1]: import netifaces
-
-
In [2]: ifnames = netifaces.interfaces()
-
-
In [3]: print(ifnames)
-
['lo', 'ens33']
通过接口名字获取该接口的IP 地址
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
获取所有网络接口的IP地址
-
[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
Python
获取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'}
要取lo的第一个ipv4地址,直接ioAddr[2][0]['addr']
获取所有端口的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
Python
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)]}
这里返回的是个字典,其中有一项是‘default'指明这个记录是默认路由信息。
其他是根据类型返回的路由信息:
key值是类型,2代表AF_INET
元组记录
192.168.124.1 路由地址
ens33 接口名字
True 是否是默认路由
summary
netiface是一个非常简单的库,为我们提供了几个简单的功能,一个是获取网络接口的名字,一个根据接口名字获取ip地址,获取路由信息。
阅读(5858) | 评论(0) | 转发(0) |