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

问题描述 投票:0回答:3

在我的 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()

但是我应该如何查找网络地址和网络字节呢?我需要将此信息放入 tcpdump 格式的过滤器中,格式为

$NetworkAddress/$NetworkBytes
,如果这有帮助的话。

示例:

128.1.2.0/20

当我运行

inet
时,我实际上可以在
ip addr
下找到它。 有什么简单的方法可以在 Python 中获取这些信息吗?

python sockets ip ip-address
3个回答
18
投票

对于 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

(如此处建议:在 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

3
投票

您可以使用 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()

0
投票

嘿嘿!回复较晚,但您可以使用 ipadress 获取网络地址(假设您有网络掩码和同一子网上设备的 IP 地址)

import ipaddress
device_ip = "192.168.1.20"
network_subnet = "255.255.255.0"
network_address = ipaddress.Ipv4Network(f"{device_ip}/{network_subnet}", strict=False)
print(network_address)

在我的例子中导致了这个:

192.168.1.0/24
© www.soinside.com 2019 - 2024. All rights reserved.