2016-09-06 371 views
1

我知道這裏有一些類似的問題,但他們大多是要找到範圍本身(它使用了一些庫,就像stackoverflow所說的例子是一個愚蠢的例子我的問題),並用另一種語言。檢查一個IP是否在Python的CIDR範圍內

我有辦法子網到開始和知識產權的範圍的子網中的最終轉換(好吧,壞的字眼,它只是像1.1.1.1/16 -> (1.1.0.0 , 1.1.255.255)

我現在要檢查是否1.1.2.2是內這個子網。我可以簡單地做一個><比較嗎?

ip_range = ('1.1.0.0', '1.1.255.255') 
if '1.1.2.2' >= ip_range[0] and '1.1.2.2' <= ip_range[1]: 
    return True 

當我測試它,它的工作原理,但我不知道它是否總是適用於任何ipv4 ip。我假設我只是比較ASCII順序,所以這應該總是工作,但有沒有例外?

+1

的可能的複製[我如何檢查如果一個IP是Python中的網絡中(http://stackoverflow.com/questions/819355/how-can-i-check-if-an-ip在網絡中的蟒蛇)和答案在http://stackoverflow.com/questions/9717089/python-ip-subnet-match – TessellatingHeckler

回答

3

你不能真正做點比較字符串分隔的數字列表,因爲你的測試只會在輸入失敗說1.1.99.99作爲'9'簡直是大於'2'

>>> '1.1.99.99' < '1.1.255.255' 
False 

因此,你可以將輸入到通過理解表達整數的元組

def convert_ipv4(ip): 
    return tuple(int(n) for n in ip.split('.')) 

注缺乏類型檢查的,但如果你輸入的是正確的IP地址會被罰款。既然你有一個2-tuple的IP地址,你可以創建一個以start和end爲參數的函數,通過參數列表傳遞這個元組,並且只用一條語句返回它(因爲Python允許鏈接比較)。也許像:

def check_ipv4_in(addr, start, end): 
    return convert_ipv4(start) < convert_ipv4(addr) < convert_ipv4(end) 

測試一下。

>>> ip_range = ('1.1.0.0', '1.1.255.255') 
>>> check_ipv4_in('1.1.99.99', *ip_range) 
True 

使用這種方法,您可以懶洋洋地將其擴展到IPv6,儘管轉換爲和從十六進制(而不是int)將需要替代。

+0

這一個工作得很好。我喜歡這可以過渡到ipv6沒有太多麻煩。 – JChao

+0

仍然錯誤:'check_ipv4_in('1.1.99.499',* ip_range)' - > ** True ** – Alexey

+0

@Alexey這只是一個無效的IP地址。閱讀我的答案,它說:「請注意沒有類型檢查,但如果您的輸入是一個正確的IP地址,它會沒事的。」 – metatoaster

4

您的代碼比較字符串,而不是數字。我會建議使用元組,而不是:

>>> ip_range = [(1,1,0,0), (1,1,255,255)] 
>>> testip = (1,1,2,2) 
>>> testip > ip_range[0] and testip < ip_range[1] 
True 
>>> testip = (1,3,1,1) 
>>> testip > ip_range[0] and testip < ip_range[1] 
False 
1

這不一般的工作,因爲字符串比較是在排序順序,而不是四個字段的數值。例如,'1.1.2.2'>'1.1.128.1' - 第5個字符中的關鍵點'1'與'2'。

如果要比較的領域,嘗試分成列表:

ip_vals = [int(x) for x in ip_range.split('.')] 

ip_vals現在是值的列表;你可以比較列表並得到我認爲你想要的結果。

4

在Python 3.3及更高版本中,您應該使用ipaddress模塊。

from ipaddress import ip_network, ip_address 

net = ip_network("1.1.0.0/16") 
print(ip_address("1.1.2.2") in net) # True 
+0

是的,我也從其他帖子看到了這種方法。我應該提到,我使用Python 2.7 .....雖然 – JChao

相關問題