IPy Python中ip位址處理模組

2021-09-14 02:41:00 字數 3687 閱讀 7588

在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...