繁体   English   中英

使用Python检索具有多个IP地址的接口的网络掩码?

[英]Retrieving netmask for interfaces with multiple IP addresses using Python?

我需要在Linux环境中使用Python列出可用的网络接口及其IP地址和相应的网络掩码。 我可以使用此处概述的ioctlSIOCGIFCONF来获取接口和每个接口的IP地址,但是当接口上有多个IP地址时要确定网络掩码时,我很SIOCGIFCONF

我可以按照在Python检索网络掩码中的建议获取接口的主IP地址的网络掩码

import socket
import fcntl
import struct

SIOCGIFNETMASK = 0x891b

def get_network_mask(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    netmask = fcntl.ioctl(s, SIOCGIFNETMASK, struct.pack('256s', ifname))[20:24]
    return socket.inet_ntoa(netmask)

>>> get_network_mask('eth0')
'255.255.255.0'

但是,如果我在同一接口上有多个具有不同网络掩码的IP地址,则此方法将无效,如下所示:

$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    inet 192.168.1.1/16 brd 192.168.255.255 scope global eth0
    inet 172.16.0.123/24 scope global eth0

在这种情况下,我只能使用上述功能来检索其中一个网络掩码。 除了解析ip addr showifconfig的输出外,是否有办法检索所有地址的网络掩码?

从技术上讲,“ ip addr sh”的作用是使用netlink库查询(并可选地监视)内核网络接口/路由表。

您也许可以在python中执行此操作,但我强烈建议您解析“ / sbin / ip addr sh”的输出

这是因为

  • 使用rtnetlink库很复杂
  • 您不在乎性能-网络接口的更改频率不足以引起您的关注(无论如何,您都可以使用“ ip monitor”来监视它们)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM