python 实现IP子网计算


Posted in Python onFebruary 18, 2021

0. 前言

IP地址目前存在两个版本:IPv4和IPv6,平常我们见到最多的就是IPv4了,如192.168.1.1/24,当然,IPv4地址池资源紧缺,IPv6已悄然大量部署了。

我们在设计网络架构时必须要对设备互联地址、环回地址、业务地址进行规划,那怎么规划?给你一个A类地址你怎么办?最重要是不是得计算?口算怕不准确吧?心算行不行,就不怕你没这本事,哈哈!

下面请用python帮你搞定这一切吧!

1. ipaddress模块介绍

1.1 IP主机地址

说明:不带掩码

怎么判断是ipv4地址,还是ipv6地址呢?使用ipaddress.ip_address() 函数可以来知晓:

>>> ipaddress.ip_address('192.168.1.1')
IPv4Address('192.168.1.1')
>>> ipaddress.ip_address('192.168.1.1').version
4

>>> ipaddress.ip_address('fe80::1')
IPv6Address('fe80::1')
>>> ipaddress.ip_address('fe80::1').version
6

如果带上掩码就会报错:

>>> ipaddress.ip_address('192.168.1.1/32')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib/python3.5/ipaddress.py", line 54, in ip_address
 address)
ValueError: '192.168.1.1/32' does not appear to be an IPv4 or IPv6 address

1.2 定义网络

说明:表示网段

一个IP地址,通常由网络号+网络前缀组成,如192.168.1.0/24,可以通过ipaddress.ip_network函数来表示,缺省情况下,python只能识别网络号,如果是IP主机就会报错,当然你可以通过strict=False来避免。

>>> ipaddress.ip_network('192.168.1.0/24')
IPv4Network('192.168.1.0/24')

#缺省,输入主机位就会报错
>>> ipaddress.ip_network('192.168.1.1/24')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib/python3.5/ipaddress.py", line 74, in ip_network
 return IPv4Network(address, strict)
 File "/usr/lib/python3.5/ipaddress.py", line 1536, in __init__
 raise ValueError('%s has host bits set' % self)
ValueError: 192.168.1.1/24 has host bits set #提示是主机IP

#修改位非严格模式,缺省为strict=True
>>> ipaddress.ip_network('192.168.1.1/24' , strict=False)
IPv4Network('192.168.1.0/24') #返回网络号

1.3 主机接口

说明:表示接口地址(ip/掩码)
一般在路由器、交换机、防火墙接口上配置IP地址,格式如192.168.1.1/24,如果使用以上ipaddress.ip_address()和ipaddress.ip_network函数的话,就不太好表示,那么可以通过ipaddress.ip_interface()函数类表示。

>>> ipaddress.ip_interface('192.168.1.1/24')
IPv4Interface('192.168.1.1/24')

1.4 检查address/network/interface对象

1.4.1 检查IP版本(v4或者v6):

>>> ipaddress.ip_address('192.168.1.1').version
4
>>> ipaddress.ip_address('fe80::1').version
6

1.4.2 从接口IP获取网段

>>> ipaddress.ip_interface('192.168.1.1/24').network
IPv4Network('192.168.1.0/24')

>>> ipaddress.ip_interface('fe80::/64').network
IPv6Network('fe80::/64')

1.4.3 计算网段有多少个IP地址

>>> ipaddress.ip_network('192.168.1.0/24').num_addresses
256

>>> ipaddress.ip_network('fe80::/64').num_addresses
18446744073709551616

1.4.4 计算网段有多少个可用IP地址

>>> net = ipaddress.ip_network('192.168.1.0/24')
>>> for x in net.hosts():
...  print(x)
... 
192.168.1.1
192.168.1.2
 ...
192.168.1.100
192.168.1.101
 ...
192.168.1.254

>>> [x for x in net.hosts()][0]  #获取第一个可用IP
IPv4Address('192.168.1.1')
>>> [x for x in net.hosts()][-1] #获取最后一个可用IP
IPv4Address('192.168.1.254')

1.4.5 获取掩码与反掩码

>>> ipaddress.ip_network('192.168.1.1/24' , strict=False).netmask
IPv4Address('255.255.255.0') #获取掩码

>>> ipaddress.ip_network('192.168.1.1/24' , strict=False).hostmask
IPv4Address('0.0.0.255') #获取反掩码

1.6 获取网络号与广播地址

>>> ipaddress.ip_network('192.168.1.1/24' , strict=False).network_address
IPv4Address('192.168.1.0')  #获取网络号

>>> ipaddress.ip_network('192.168.1.1/24' , strict=False).broadcast_address
IPv4Address('192.168.1.255') #获取广播地址

1.7 异常处理

如果遇到IP地址格式不符合要求等这些情况,那怎么处理呢?

#错误显示,报"ValueError"
>>> ipaddress.ip_network('192.168.1.1/24')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib/python3.5/ipaddress.py", line 74, in ip_network
 return IPv4Network(address, strict)
 File "/usr/lib/python3.5/ipaddress.py", line 1536, in __init__
 raise ValueError('%s has host bits set' % self)
ValueError: 192.168.1.1/24 has host bits set

#通过try-except语句来处理异常情况
>>> import ipaddress
>>> def cal_ip(net):
...  try:
...   net = ipaddress.ip_network(net)
...   print(net)
...  except ValueError:
...   print('您输入格式有误,请检查!')
... 
>>> cal_ip(net = '192.168.1.1/24')
您输入格式有误,请检查!

2. 计算IP子网代码演示

2.1 完整代码

#!/usr/bin/env python3
#-*- coding:UTF-8 -*-
#欢迎关注微信公众号:点滴技术

import ipaddress

def cal_ip(ip_net):
 try:
  net = ipaddress.ip_network(ip_net, strict=False)
  print('IP版本号: ' + str(net.version))
  print('是否是私有地址: ' + str(net.is_private))
  print('IP地址总数: ' + str(net.num_addresses))
  print('可用IP地址总数: ' + str(len([x for x in net.hosts()])))
  print('网络号: ' + str(net.network_address))
  print('起始可用IP地址: ' + str([x for x in net.hosts()][0]))
  print('最后可用IP地址: ' + str([x for x in net.hosts()][-1]))
  print('可用IP地址范围: ' + str([x for x in net.hosts()][0]) + ' ~ ' + str([x for x in net.hosts()][-1]))
  print('掩码地址: ' + str(net.netmask))
  print('反掩码地址: ' + str(net.hostmask))
  print('广播地址: ' + str(net.broadcast_address))
 except ValueError:
  print('您输入格式有误,请检查!')

if __name__ == '__main__':
 ip_net = '192.168.1.1/24'
 cal_ip(ip_net)

2.2 运行结果

IP版本号: 4
是否是私有地址: True
IP地址总数: 256
可用IP地址总数: 254
网络号: 192.168.1.0
起始可用IP地址: 192.168.1.1
最后可用IP地址: 192.168.1.254
可用IP地址范围: 192.168.1.1 ~ 192.168.1.254
掩码地址: 255.255.255.0
反掩码地址: 0.0.0.255
广播地址: 192.168.1.255

3. 碎碎语

怎么样,学完之后是不是很亢奋,不需要借助其他工具进行计算了吧,用python就帮你搞定了。

3.1 官方参考文档

https://docs.python.org/3.8/howto/ipaddress.html

以上就是python 实现IP子网计算的详细内容,更多关于python IP子网计算的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python的Django框架中设置日期和字段可选的方法
Jul 17 Python
python开发之for循环操作实例详解
Nov 12 Python
Python简单格式化时间的方法【strftime函数】
Sep 18 Python
Python编程修改MP3文件名称的方法
Apr 19 Python
如何高效使用Python字典的方法详解
Aug 31 Python
python3.4爬虫demo
Jan 22 Python
python mysql断开重连的实现方法
Jul 26 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
Oct 16 Python
python opencv将表格图片按照表格框线分割和识别
Oct 30 Python
Python 过滤错误log并导出的实例
Dec 26 Python
Pytorch 多维数组运算过程的索引处理方式
Dec 27 Python
详细总结Python常见的安全问题
May 21 Python
详解python3 GUI刷屏器(附源码)
Feb 18 #Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 #Python
Python如何telnet到网络设备
Feb 18 #Python
Python运算符+与+=的方法实例
Feb 18 #Python
python 获取计算机的网卡信息
Feb 18 #Python
python中time tzset()函数实例用法
Feb 18 #Python
python中zip()函数遍历多个列表方法
Feb 18 #Python
You might like
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
jQuery中click事件用法实例
2014/12/26 Javascript
Nodejs 发送Post请求功能(发短信验证码例子)
2017/02/09 NodeJs
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
JavaScript实现的数字与字符串转换功能示例
2017/08/23 Javascript
微信小程序云开发修改云数据库中的数据方法
2019/05/18 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
python发布模块的步骤分享
2014/02/21 Python
python实现图片批量剪切示例
2014/03/25 Python
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
2017/11/09 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
Django保护敏感信息的方法示例
2019/05/09 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
python 在sql语句中使用%s,%d,%f说明
2020/06/06 Python
python如何更新包
2020/06/11 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
python自动生成sql语句的脚本
2021/02/24 Python
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
外贸主管求职简历的自我评价
2013/10/23 职场文书
初婚初育证明
2014/01/14 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
生日宴会家属答谢词
2015/09/29 职场文书
同学聚会开幕词
2019/04/02 职场文书
超级详细实用的pycharm常用快捷键
2021/05/12 Python
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript