Python學習筆記-IP地址處理模塊Ipy

IP地址處理模塊Ipy

    IPy模塊可以很好的輔助我們高效完成IP的規劃工作。

    參考:https://github.com/autocracy/python-ipy

        安裝IPy模塊

[root@kurol ~]# python36 -m easy_install -i http://pypi.douban.com/simple/ IPy

       導入模塊

In [12]: from IPy import IP

1、IP地址、網段的基本處理

        通過version區分IPv4和IPv6:

In [13]: testip = ('10.0.0.0/8','::1')
In [14]: IP(testip[0]).version()
Out[14]: 4
In [15]: IP(testip[1]).version()
Out[15]: 6

        通過指定的網段輸出該網段的IP個數及所有IP地址清單:

In [25]: testip1 = IP('192.168.1.0/24')
In [26]: print (testip1.len())
256
In [27]: for x in testip1:
 ...: print (x)
 ...: 
192.168.1.0
192.168.1.1
192.168.1.2
......

 IP類常用方法:

In [32]: testip2 = IP('192.168.100.10')

In [33]: testip2.reverseNames() #反向解析地址格式
Out[33]: ['10.100.168.192.in-addr.arpa.']

In [34]: testip2.iptype()   #返回IP類型,192.168.100.10爲私有地址
Out[34]: 'PRIVATE'

In [35]: IP('8.8.8.8').iptype()   #返回IP類型,8.8.8.8爲共有地址
Out[35]: 'PUBLIC'

In [36]: testip2.int()  #轉換成整型格式
Out[36]: 3232261130

In [37]: testip2.strHex()   #轉換成十六進制格式
Out[37]: '0xc0a8640a'

In [38]: testip2.strBin()   #轉換成二進制格式
Out[38]: '11000000101010000110010000001010'

In [39]: print (IP(0xc0a8640a))   #十六進制轉成IP格式
192.168.100.10

        網絡地址轉換,根據IP與掩碼生成網段格式:

In [47]: print (IP('192.168.1.0').make_net('255.255.255.0'))
192.168.1.0/24
In [48]: print (IP('192.168.1.0/255.255.255.0',make_net=True))
192.168.1.0/24
In [49]: print (IP('192.168.1.0-192.168.1.255',make_net=True))
192.168.1.0/24

  通過strNormal方法指定不同wantprefixlen參數值以定製不同輸出類型的網段。輸出類型爲字符串:

wantprefixlen取值及含義:

  •     wantprefixlen=0,無返回,如192.168.1.0

  •     wantprefixlen=1,prefix格式,如192.168.1.0/24

  •     wantprefixlen=2,decimalnetmask格式,如192.168.1.0/255.255.255.0

  •     wantprefixlen=3,lastIP格式,如192.168.1.0-192.168.1.255

In [52]: IP('192.168.1.0/24').strNormal(wantprefixlen=0)
Out[52]: '192.168.1.0'
In [53]: IP('192.168.1.0/24').strNormal(wantprefixlen=1)
Out[53]: '192.168.1.0/24'

#省略wantprefixlen
In [54]: IP('192.168.1.0/24').strNormal(0)
Out[54]: '192.168.1.0'
In [55]: IP('192.168.1.0/24').strNormal(1)
Out[55]: '192.168.1.0/24'
In [56]: IP('192.168.1.0/24').strNormal(2)
Out[56]: '192.168.1.0/255.255.255.0'
In [57]: IP('192.168.1.0/24').strNormal(3)
Out[57]: '192.168.1.0-192.168.1.255'

2、多網絡計算方法

    IPy支持類似於數值型數據的比較,以幫助IP對象進行比較

In [67]: IP('10.0.0.0/24') > IP('12.0.0.0/24')
Out[67]: False
In [68]: IP('10.0.0.0/24') < IP('12.0.0.0/24')
Out[68]: True

 判斷IP地址和網段是否包含於另一個網段中:

In [69]: '192.168.1.100' in IP('192.168.1.0/24')
Out[69]: True
In [70]: '192.168.2.100' in IP('192.168.1.0/24')
Out[70]: False
In [71]: '192.168.1.0/24' in IP('192.168.0.0/16')
Out[71]: True

判斷兩個網段是否存在重疊,採用IPy提供的overlaps方法:

In [74]: IP('192.168.0.0/23').overlaps('192.168.1.0/24')
Out[74]: 1  #返回1代表存在重疊
In [75]: IP('192.168.1.0/24').overlaps('192.168.2.0')
Out[75]: 0#返回0代表不存在重疊

實例:根據輸入的IP或子網返回網絡、掩碼、廣播、反向解析、子網數、IP類型等信息:

[root@kurol pkg1]# vim testip.py 
#!/usr/bin/python
#coding:utf-8
#
from IPy import IP
import sys 
reload(sys)
sys.setdefaultencoding('utf-8')
ip_test = raw_input('請輸入IP地址或網段地址:')
ips = IP(ip_test)
if len(ips) > 1:
 print ('網絡地址:%s' % ips.net())
 print ('掩碼:%s' % ips.netmask())
 print ('網絡廣播地址:%s' % ips.broadcast())
 print ('地址反向解析:%s' % ips.reverseNames())
 print ('網絡子網數:%s' % len(ips))
else:
 print ('IP反向解析 %s' % ips.reverseNames())
print ('此IP地址轉換成十六進制: %s' % ips.strHex())
print ('此IP地址轉換成二進制: %s' % ips.strBin())
print ('此IP地址類型: %s' % ips.iptype())


執行結果:

[root@kurol pkg1]# python testip.py 
請輸入IP地址或網段地址:192.168.1.0/24
網絡地址:192.168.1.0
掩碼:255.255.255.0
網絡廣播地址:192.168.1.255
地址反向解析:['1.168.192.in-addr.arpa.']
網絡子網數:256
此IP地址轉換成十六進制: 0xc0a80100
此IP地址轉換成二進制: 11000000101010000000000100000000
此IP地址類型: PRIVATE

[root@kurol pkg1]# python testip.py 
請輸入IP地址或網段地址:192.168.1.1
IP反向解析 ['1.1.168.192.in-addr.arpa.']
此IP地址轉換成十六進制: 0xc0a80101
此IP地址轉換成二進制: 11000000101010000000000100000001
此IP地址類型: PRIVATE


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章