检查IP地址是否在给定范围内

时间:2017-01-13 05:30:38

标签: python python-3.x python-2.7 ip-address

我想检查IP 180.179.77.11是否位于特定范围之间,例如180.179.0.0 - 180.179.255.255

我编写了一个函数,它将每个IP八位字节与其他八位字节进行比较。

def match(mask, IP):
    min_ip = mask.split(' - ')[0].split('.')
    max_ip = mask.split(' - ')[1].split('.')
    ip = IP.split('.')
    for i in range(4):
        print ip[i] + " < " + min_ip[i] + " or " + ip[i] + " > " + max_ip[i]
        print ip[i] < min_ip[i] or ip[i] > max_ip[i]
        if ip[i] < min_ip[i] or ip[i] > max_ip[i]:
            return False
    return True


match("180.179.0.0 - 180.179.255.255", "180.179.77.11")

输出:

180 < 180 or 180 > 180
False
179 < 179 or 179 > 179
False
77 < 0 or 77 > 255  # 77 > 255 is true
True
False

然而,它似乎没有正常工作;在将77255进行比较时,看起来问题出现在第3个八位字节中。

我已经放了一些印刷语句来说明问题区域。

4 个答案:

答案 0 :(得分:2)

您正在比较字符串值(按字典顺序进行比较),而不是每个IP的int值,请将它们整理为具有理解力的整数:

min_ip = [int(i) for i in mask.split(' - ')[0].split('.')]
max_ip = [int(i) for i in mask.split(' - ')[1].split('.')]
ip = [int(i) for i in IP.split('.')]

如果你不为mask中的每个ip执行拆分两次,那也是最好的;事先分开:

s = mask.split(' - ')
min_ip, max_ip = [[int(i) for i in j.split('.')] for j in s]

如果您将forenumerate一起使用,那么ip循环可能会更好:

for ind, val in enumerate(ip):
    if val < min_ip[ind] or val > max_ip[ind]:
        return False

答案 1 :(得分:1)

当你调用匹配函数时,传入的字符串会根据八位字节进行分割。然而,当进行比较时,被比较的八位字节仍然是一个字符串。因此'7'>第三个八位位组的'2'。如果将每个八位字节转换为整数:

if int(ip[i]) < int(min_ip[i]) or int(ip[i]) > int(max_ip[i]):

您将获得预期的回复。

答案 2 :(得分:0)

你的剧本出了什么问题 - 你正在比较字符串&amp;不是数字。

你可以试试这个:

def match(mask, IP):
    min_ip = mask.split(' - ')[0].split('.')
    print min_ip
    max_ip = mask.split(' - ')[1].split('.')
    print max_ip
    ip = IP.split('.')
    print ip
    for i in range(4):
        if int(ip[i]) < int(min_ip[i]) or int(ip[i]) > int(max_ip[i]):
            return False
    return True
print(match("180.179.0.0 - 180.179.255.255", "180.179.77.11"))

答案 3 :(得分:0)

没有循环,希望它有用。

def match(mask, IP):
    min_ip = mask.split(' - ')[0].split('.')
    max_ip = mask.split(' - ')[1].split('.')
    range4 = range(int(min_ip[-2]), int(max_ip[-2]) + 1)
    range3 = range(int(min_ip[-1]), int(max_ip[-1]) + 1)

    ip = IP.split(".")
    if ( (int(ip[-2]) in range3) and (int(ip[-1]) in range4) ):
        return True

    return False

print match("180.179.0.0 - 180.179.255.255", "180.179.77.11")