我正在尝试获取我拥有的IP地址的子网。
例如:
1
子网掩码:255.255.255.0
输入:192.178.2.55
输出:192.178.2.0
2
子网掩码:255.255.0.0
输入:192.178.2.55
输出:192.178.0.0
目前,我这样做(对于子网255.255.255.0)
ip = '192.178.2.55'
subnet = '.'.join(ip.split('.')[:2]) + '.0.0'
subnet
'192.178.0.0'
我看到python有的ipaddress库。但是,我找不到可以完成上述任务的方法。
额外的好处:由于ipaddress支持IPv4和IPv6,如果两个都可以使用相同的函数。
发布于 2018-06-15 08:04:05
ipaddress.ip_network
函数可以采用IPv4Network
和IPv6Network
可以采用的任何字符串格式,包括address/mask
格式。
由于您实际上传递的不是网络地址,而是该网络中设置了主机位的地址,因此需要使用strict=False
。
所以:
>>> net = ipaddress.ip_network('192.178.2.55/255.255.255.0', strict=False)
>>> net
IPv4Network('192.178.2.0/24')
>>> net.network_address
IPv4Address('192.178.2.0')
>>> net.netmask
IPv4Address('255.255.255.0')
或者,您可以使用ip_interface
并从中提取网络:
>>> iface = ipaddress.ip_interface('192.178.2.55/255.255.255.0')
>>> iface
IPv4Interface('192.178.2.55/24')
>>> iface.network
IPv4Network('192.178.2.0/24')
>>> iface.netmask
IPv4Address('255.255.255.0')
>>> iface.ip
IPv4Address('192.178.2.55')
>>> iface.network.network_address
IPv4Address('192.178.2.0')
你想要这两个中的哪一个取决于你到底想代表什么。请注意,接口类型是Address类型的子类,当然它们会记住用于构造它们的原始地址,而Network类则会记住网络地址;这两个类中的一个通常是决定因素。
当然,这两种方法在IPv6上都能很好地工作:
>>> ipaddress.ip_interface('2001:db8::1000/32')
IPv6Interface('2001:db8::1000/32')
>>> ipaddress.ip_interface('2001:db8::1000/32').network.network_address
IPv6Address('2001:db8::')
发布于 2018-06-15 08:02:42
subnet
只是一个简单的二进制掩码,它必须与IP地址逐位and
。你可以自己应用掩码:
".".join(map(str, [i & m # Apply the mask
for i,m in zip(map(int, ip.split(".")),
map(int, subnet.split(".")))]))
#'192.178.2.0'
此解决方案仅适用于IPv4地址。
https://stackoverflow.com/questions/50867435
复制相似问题