如何通过python整理出从192.55.22.0到192.56.22.0的所有域范围
我想对一个IP地址范围执行一组网络任务。一旦范围变大,我就无法枚举范围内的所有主机。我希望能够使用网络掩码遍历网络的所有主机如果我将任何范围从一个传递到另一个以在范围之间显示
问问题
198 次
2 回答
4
你的例子有点混乱。“192.55.22.0”和“192.56.22.0”之间是什么?您写了“使用网络掩码遍历网络的所有主机”,但该范围不是一个完整的网络。
在一般情况下,要从某个 ip 迭代到另一个,您可以使用:
def ip_atoi(ip):
return struct.unpack('!I', socket.inet_aton(ip))[0]
def ip_itoa(ip):
return socket.inet_ntoa(struct.pack('!I', ip))
current = ip_atoi('192.55.22.0')
end = ip_atoi('192.56.22.0')
for ip in xrange(current, end):
do_something_on(ip_itoa(ip))
如果您在这么多主机上快速执行网络操作时遇到问题,请查看Pool
模块multiprocessing
。它可能会通过一次处理几个主机来加快您的操作。
于 2011-06-11T11:17:14.897 回答
3
使用纯 Python(和 IPv6 支持):
import socket,struct
# In Python 3+, you can simply use range
# In Python 2, you can substitute xrange if you're only dealing with IPv4
def _range(a, b):
while a<b:
yield a
a+=1
def addrRange(start,end,fam=socket.AF_INET):
famFmt = '!I' if fam == socket.AF_INET else '!Q'
addr2int = lambda a: struct.unpack(famFmt, socket.inet_pton(fam, a))[0]
for ai in _range(addr2int(start), addr2int(end)+1):
yield socket.inet_ntop(fam, struct.pack(famFmt, ai))
for a in addrRange('192.55.22.0', '192.56.22.0'):
print(a) # Or do something with the address
于 2011-06-11T11:19:09.543 回答