在 Python 中获取网络地址和网络掩码

Posted

技术标签:

【中文标题】在 Python 中获取网络地址和网络掩码【英文标题】:Get network address and network mask in Python 【发布时间】:2012-07-12 07:03:56 【问题描述】:

在我的 Python 脚本中,我需要检索运行脚本的机器的 IP 地址及其网络地址和网络字节。

至于IP地址,我在存档中找到了解决方案:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("www.google.com",80))
myAddress = (s.getsockname()[0])
s.close()

但是我应该如何查找网络地址和网络字节?我需要将此信息以$NetworkAddress/$NetworkBytes 的格式放入 tcpdump 的过滤器中,如果这有帮助的话。

例子:

128.1.2.0/20

当我运行ip addr 时,我实际上可以在inet 下找到它。在 Python 中获取此信息的任何简单方法?

【问题讨论】:

NetworkBytes 还是网络掩码? +1 用于展示你目前拥有的东西 “网络地址”和“网络字节”是什么意思? 好的,我在原始帖子中添加了更多详细信息。 您的示例似乎是 IP 地址/前缀长度。我仍然不知道您所说的“NetworkBytes”是什么意思,因为如果这应该与“前缀长度”的含义相同,那么 NetworkBytes 是一个非常奇怪的名称……无论如何,如果您的意思是 IP 地址/前缀长度,那么,您是指分配给运行脚本的机器上的本地接口之一的 IP 地址和前缀长度吗? 【参考方案1】:

Linux 试试

iface = "eth0"
socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 
                             35099, struct.pack('256s', iface))[20:24])

或http://github.com/rlisagor/pynetlinux

(这里建议:Retrieving network mask in Python)

对于 Linux、Windows 和 MacOS,请考虑http://alastairs-place.net/projects/netifaces/

更新:

如果您需要 cidr(如 '128.1.2.0/20'),您可以使用任何相关库:http://pypi.python.org/pypi?%3Aaction=search&term=cidr&submit=search

例如netaddr:

>> from netaddr import IPNetwork
>> print str(IPNetwork('1.2.3.4/255.255.255.0').cidr)
1.2.3.0/24

【讨论】:

谢谢。实际上,我需要问题中给出的形式,即“地址/前缀长度”而不是实际的网络掩码。有什么快速的方法吗? 您对哪个操作系统感兴趣? 谢谢。我找不到包 netstat。你能指点给我吗?再次感谢!【参考方案2】:

您可以使用pyroute2 模块检索任何与 ip 相关的信息:

from pyroute2 import IPDB
ip = IPDB()
print(ip.interfaces['em1'].ipaddr)
ip.release()

或作为变体:

from pyroute2 import IPRoute
ip = IPRoute()
info = ['iface': x['index'],
         'addr': x.get_attr('IFA_ADDRESS'),
         'mask': x['prefixlen'] for x in ip.get_addr()]
ip.close()

【讨论】:

以上是关于在 Python 中获取网络地址和网络掩码的主要内容,如果未能解决你的问题,请参考以下文章

给定 IP 和网络掩码,如何使用 bash 计算网络地址?

MFC自己主动获取网络地址函数实现----广播地址,网关,子网掩码

如何从本地接口获取所有地址和掩码?

知道IP地址和子网掩码怎么求主机号和网络地址

通过ip地址和子网掩码计算网络号,子网号和主机号?

主机地址与子网掩码有啥关系?