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批量生成本地ip地址的方法
Mar 23 Python
python下paramiko模块实现ssh连接登录Linux服务器
Jun 03 Python
python字典键值对的添加和遍历方法
Sep 11 Python
Python使用requests发送POST请求实例代码
Jan 25 Python
Python实现的三层BP神经网络算法示例
Feb 07 Python
Django中url的反向查询的方法
Mar 14 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
Python将string转换到float的实例方法
Jul 29 Python
python 非线性规划方式(scipy.optimize.minimize)
Feb 11 Python
Numpy实现卷积神经网络(CNN)的示例
Oct 09 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
pandas中pd.groupby()的用法详解
Jun 16 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
mysqli_set_charset和SET NAMES使用抉择及优劣分析
2013/01/13 PHP
解析PHP实现多进程并行执行脚本
2013/06/18 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
PHP常见的序列化与反序列化操作实例分析
2019/10/28 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
js的一些常用方法小结
2011/06/29 Javascript
JS文本框追加多个下拉框的值的简单实例
2013/07/12 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
vue-cli构建项目使用 less的方法
2017/10/04 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
vue实现菜单切换功能
2019/05/08 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
Python2和Python3中print的用法示例总结
2017/10/25 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
python flask搭建web应用教程
2019/11/19 Python
python和js交互调用的方法
2020/06/23 Python
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
基于Python实现将列表数据生成折线图
2022/03/23 Python
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers