如何循环IP范围?

时间:2014-05-04 17:32:23

标签: python ip

在python中循环IP范围的最简单方法是什么?我看了几个例子,但没有一个适合我。我尝试了以下技术,效果很好,但是当它到达范围的末尾时它不会退出循环。例如,我将通过命令行

指定以下参数
python loop.py 1.0.0.0 2.0.0.0 

当范围达到2.0.0.0

时,循环不会停止执行
start_ip = string.split(sys.argv[1], ".")
end_ip = string.split(sys.argv[2], ".")

for c1 in range(int(start_ip[0]), 255):
    for c2 in range(int(start_ip[1]), 255):
        for c3 in range(int(start_ip[2]), 255):
            for c4 in range(int(start_ip[3]), 255):
                if "%d.%d.%d.%d" % (c1, c2, c3, c4) == "%d.%d.%d.%d" % (int(end_ip[0]), int(end_ip[1]), int(end_ip[2]), int(end_ip[3])):
                    break
                else:
                    print "%d.%d.%d.%d" % (c1, c2, c3, c4)

如果有人能告诉我为什么我的代码无法正常工作,或者告诉我更好的方法来迭代IP范围,那将会很棒,谢谢。所有帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

您的循环逻辑错误。在if语句中,您与IP地址的上限进行比较,break语句只会打破if语句之上的直接循环。

因此它继续在整个范围内运行。你需要打破每个for循环。像这样:

done = False

for c1 in range(int(start_ip[0]), 255):
    for c2 in range(int(start_ip[1]), 255):
        for c3 in range(int(start_ip[2]), 255):
            for c4 in range(int(start_ip[3]), 255):
                if "%d.%d.%d.%d" % (c1, c2, c3, c4) == "%d.%d.%d.%d" % (int(end_ip[0]), int(end_ip[1]), int(end_ip[2]), int(end_ip[3])):
                    done = True
                    break
                else:
                    print "%d.%d.%d.%d" % (c1, c2, c3, c4)
            if(done):
                break
        if(done):
            break
    if(done):
        break

答案 1 :(得分:0)

由于IP只有4个字节,因此可以表示为单个32位整数。这样,如果我们可以从和转换到这个整数,我们只需要一个循环:

# How much is each byte 'worth' in the ip?
units = [1 << (8 * i) for i in range(3, -1, -1)]


def ip_to_int(ip):
    return sum(int(byte) * unit for (byte, unit) in zip(ip.split('.'), units))


def int_to_ip(i):
    return '.'.join(str((i / bit) & 0xff) for bit in units)

#----------------------
start_ip = "1.0.0.0"
end_ip = "2.0.0.0"

ips = (int_to_ip(i) for i in xrange(ip_to_int(start_ip), ip_to_int(end_ip)))
for ip in ips:
    print ip

这使得循环非常简单,并且还可以让您轻松查看一个IP是否大于另一个IP或等于它(仅比较整数)。