在python中查找下一个可用的IP地址

时间:2016-05-30 00:44:11

标签: python

使用python我需要在已经使用的IP地址范围内找到下一个IP地址。所以,如果我有一个IP地址列表,如...

IPs = ['10.220.1.1','10.220.1.2','10.220.1.3','10.220.1.5']

当我要求下一个IP地址时,我需要它返回< 10.220.1.4'。下一个请求将返回< 10.220.1.6'等等。

5 个答案:

答案 0 :(得分:3)

如果您使用的是Python 3.3(或更新版本),则可以使用ipaddress模块。子网var lat, lng; map.addEventListener('mousemove', function(ev) { lat = ev.latlng.lat; lng = ev.latlng.lng; }); document.getElementById("transitmap").addEventListener("contextmenu", function (event) { // Prevent the browser's context menu from appearing event.preventDefault(); // Add marker // L.marker([lat, lng], ....).addTo(map); alert(lat + ' - ' + lng); return false; // To disable default popup. }); 中所有主机的示例,10.220.1.0/24中的主机除外:

reserved

所以基本上这可以在一行中完成(+导入和定义网络和保留地址)。

答案 1 :(得分:0)

您可以使用ipaddress模块使用生成器,该模块是来自python> = 3.3的bultin,或者您可以使用pip安装早期版本:

In [20]: from ipaddress import ip_network

In [21]: IPs = {'10.220.1.1','10.220.1.2','10.220.1.3','10.220.1.5'}

In [22]: net = ip_network(u"10.220.1.0/24")

In [23]: avail =(str(ip) for ip in net.hosts() if str(ip) not in IPs
   ....: )

In [24]: next(avail)
Out[24]: '10.220.1.4'

In [25]: next(avail)
Out[25]: '10.220.1.6'

答案 2 :(得分:0)

如果您使用的是Python 3,则可以将ipaddress与generator:

一起使用
import ipaddress

def gen_ip(start, reserved):
    start = int(ipaddress.IPv4Address(start))
    for i in range(start + 1, int(2 ** 32) + 1):
        ip = str(ipaddress.IPv4Address(i))
        if ip not in reserved:
            yield ip

IPs = ['10.220.1.1','10.220.1.2','10.220.1.3','10.220.1.5']
j = 0
for ip in gen_ip(min(IPs), set(IPs)):
    print(ip)
    j += 1
    if j == 5:
        break

输出:

10.220.1.4
10.220.1.6
10.220.1.7
10.220.1.8
10.220.1.9

答案 3 :(得分:0)

创建一个基本的ip对象来保存当前ip的记录并获取下一个ip

class IPObj(object):
    def __init__(self, list_of_ips):
        self.position = 0
        self.ips = list_of_ips
        self.current_ip = self.ips[self.position]

    def next_ip(self, stop_iteration=False):
        '''
            return the next ip in the list
            '''

        if self.position >= len(self.ips)-1:
            self.position = 0 # By default next_ip will do nothing when it reaches the end but it will throw an exception if stop_iteration==True
            if stop_iteration:
                raise StopIteration
        self.position += 1
        self.current_ip = self.ips[self.position]
        return self.current_ip

    def __repr__(self):
        return repr(self.current_ip)


#Testing    
ips = IPObj(['10.220.1.1','10.220.1.2','10.220.1.3','10.220.1.5'])

print ips

while True:
    print ips.next_ip(True),

输出: 10.220.1.1,  10.220.1.2,  10.220.1.3,  10.220.1.5,

  

追踪(最近一次呼叫最后一次):

     

文件“C:\ Users \ J10ey \ workspace \ SO_Help \ src \ ip's.py”,第32行,在      print ips.next_ip(True)    在next_ip中输入文件“C:\ Users \ J10ey \ workspace \ SO_Help \ src \ ip's.py”,第21行      提高StopIteration   StopIteration异常

答案 4 :(得分:0)

将您的列表转换为一组,以提高性能:

used_ips = set(IPs)

现在生成您想要的IP#,并检查它们是否包含在集合中:

for next_ip in generate_ip_numbers():
    if next_ip in used_ips:
        continue

    print("Next ip address is:", next_ip)