给定一个ip地址(比如192.168.0.1),如何在Python中检查它是否在网络中(比如192.168.0.0/24)?
Python中是否有用于ip地址操作的通用工具?像主机查找,ip地址到int,网络地址和网络掩码到int等等?希望是在2.5的标准Python库中。
发布于 2009-05-04 09:21:30
This article表明,您可以使用socket
和struct
模块完成此任务,而无需付出太多额外的努力。我在文章中添加了一些内容,如下所示:
import socket,struct
def makeMask(n):
"return a mask of n bits as a long integer"
return (2L<<n-1) - 1
def dottedQuadToNum(ip):
"convert decimal dotted quad string to long integer"
return struct.unpack('L',socket.inet_aton(ip))[0]
def networkMask(ip,bits):
"Convert a network address to a long integer"
return dottedQuadToNum(ip) & makeMask(bits)
def addressInNetwork(ip,net):
"Is an address in a network"
return ip & net == net
address = dottedQuadToNum("192.168.1.1")
networka = networkMask("10.0.0.0",24)
networkb = networkMask("192.168.0.0",24)
print (address,networka,networkb)
print addressInNetwork(address,networka)
print addressInNetwork(address,networkb)
这将输出以下内容:
False
True
如果你只想要一个接受字符串的函数,它应该是这样的:
import socket,struct
def addressInNetwork(ip,net):
"Is an address in a network"
ipaddr = struct.unpack('L',socket.inet_aton(ip))[0]
netaddr,bits = net.split('/')
netmask = struct.unpack('L',socket.inet_aton(netaddr))[0] & ((2L<<int(bits)-1) - 1)
return ipaddr & netmask == netmask
发布于 2009-05-04 13:35:14
我喜欢使用netaddr实现这一点:
from netaddr import CIDR, IP
if IP("192.168.0.1") in CIDR("192.168.0.0/24"):
print "Yay!"
正如arno_v在评论中指出的那样,新版本的netaddr是这样做的:
from netaddr import IPNetwork, IPAddress
if IPAddress("192.168.0.1") in IPNetwork("192.168.0.0/24"):
print "Yay!"
发布于 2018-07-23 14:04:07
对于python3
import ipaddress
ipaddress.IPv4Address('192.168.1.1') in ipaddress.IPv4Network('192.168.0.0/24')
ipaddress.IPv4Address('192.168.1.1') in ipaddress.IPv4Network('192.168.0.0/16')
输出:
False
True
https://stackoverflow.com/questions/819355
复制相似问题