在ip位址規劃中,涉及到計算大量的ip位址,包括網段、網路掩碼、廣播位址、子網數、ip型別等。別擔心,ipy模組拯救你。ipy模組可以很好的輔助我們高效的完成ip的規劃工作。
pip install ipy
目前 conda 好像不支援
1.ipy模組包含ip類,使用它可以方便處理絕大部分格式為ipv6的網路和位址
比如通過version方法來區分出ipv4和ipv6
>>> import ipy
>>> ipy.ip('10.0.0.0/8').version()
4>>> ipy.ip('::1').version()
6
2.通過指定的網段輸出該網段的ip個數和所有的ip位址清單
$ more ip.py
#!/usr/bin/env python
import ipy
ip = ipy.ip('192.168.0.0/16')
print ip.len()
for x in ip:
print x
3.反向解析名稱、ip型別、ip轉換等
>>> ip = ip('192.168.1.20')
>>> ip.reversenames() #反向解析位址格式
['20.1.168.192.in-addr.arpa.']
>>> ip.iptype() #私網型別
'private'
>>> ip('8.8.8.8').iptype() #公網型別
'public'
>>> ip('8.8.8.8').int() #轉換為整型格式
134744072
>>> ip('8.8.8.8').strhex() #轉換為十六進製制格式
'0x8080808'
>>> ip('8.8.8.8').strbin() #轉換成二進位制格式
'00001000000010000000100000001000'
>>> print ip('0x8080808') #十六進製制轉換為ip格式
8.8.8.8
>>> print ip(134744072) #整型格式轉換為ip格式
8.8.8.8
4.ip方法也支援網路位址的轉換,例如根據ip和掩碼產生網段格式
>>> print (ip('192.168.1.0').make_net('255.255.255.0'))
192.168.1.0/24
>>> print (ip('192.168.1.0/255.255.255.0',make_net=true))
192.168.1.0/24
>>> print (ip('192.168.1.0-192.168.1.255',make_net=true))
192.168.1.0/24
5.通過strnormal方法指定不同wantprefixlen引數值以定製不同輸出型別的網段,輸出型別為字串、、
>>> ip('192.168.1.0/24').strnormal(0) #無返回
'192.168.1.0'
>>> ip('192.168.1.0/24').strnormal(1) #prefix格式
'192.168.1.0/24'
>>> ip('192.168.1.0/24').strnormal(2) #decimalnetmask格式
'192.168.1.0/255.255.255.0'
>>> ip('192.168.1.0/24').strnormal(3) #lastip格式
'192.168.1.0-192.168.1.255'
比較兩個網段是否存在包含、重疊等關係,比如同網路但不同prefixlen會認為是不相等的網段,如10.0.0.0/16不等於10.0.0.0/24,另外即使具有相同的prefixlen但處於不同的網路位址,同樣也視為不相等,如10.0.0.0/16不等於192.0.0.0/16。ipy支援類似於數值型資料的比較,以幫助ip物件進行比較。
1.比較ip大小
>>> from ipy import ip
>>> ip('10.0.0.0/24') < ip('12.0.0.0/24')
true
2.判斷ip位址和網段是否包含於另乙個網段中
>>> '192.168.1.100' in ip('192.168.1.0/24')
true
>>> ip('192.168.1.0/24') in ip('192.168.0.0/16')
true
>>> '192.168.1.0/24' in ip('192.168.0.0-192.168.8.255')
true
3.判斷兩個網段是否存在重疊(overlaps方法)
1.0.1.0/22 無法識別,我猜測,ipy識別子網的時候,只能從0開始,不能從1開始,於是我又試了一下:
for i in ip('1.0.2.0/23'):
print(i)
輸出:1.0.2.0 到 1.0.3.255
for i in ip('1.0.1.0/23'):
print(i)
報錯:ip('1.0.1.0/23') has invalid prefix length (23)
這驗證了我的猜想:
我的本意是判斷乙個ip是否存在於 1.0.1.0 到 1.0.3.255,但是在這過程中,ipy將其轉換成子網掩碼的形式,但又沒有其他機制,比如智慧型地從1開始往後數,比如 1.0.1.0/22 可以算成 1.0.0.0/22 除去 1.0.0.0/24 的剩下的位址 (1.0.1.0/24, 1.0.2.0/24, 1.0.3.0/24)
沒辦法,在其不完善的情況下,只能想別的辦法,以下是我的解決方案
ip('1.0.2.100').int() > ip('1.0.1.0').int() and ip('1.0.2.100').int()
< ip('1.0.3.255').int()
把ip位址轉換成10進製,再來判斷是否屬於某網段,就可以了
IP位址中的保留位址
保留ip位址的分配 網際網路上的ip位址統一由乙個叫iana internet assigned numbers authority,網際網路網路號分配機構 的組織來管理。根據用途和安全性級別的不同,ip位址還可以大致分為兩類 公共位址和私有位址。公用位址在internet中使用,可以在intern...
IP位址中的保留位址
保留ip位址的分配 網際網路上的ip位址統一由乙個叫iana internet assigned numbers authority,網際網路網路號分配機構 的組織來管理。根據用途和安全性級別的不同,ip位址還可以大致分為兩類 公共位址和私有位址。公用位址在internet中使用,可以在intern...
IP位址中的保留位址
保留ip位址的分配 網際網路上的ip位址統一由乙個叫iana internet assigned numbers authority,網際網路網路號分配機構 的組織來管理。根據用途和安全性級別的不同,ip位址還可以大致分為兩類 公共位址和私有位址。公用位址在internet中使用,可以在intern...