一舟集团

首页 > 铜缆系统 > 一舟综合布线

网络工程师 Python IP地址(netaddr模块)

网络工程师 Python IP地址(netaddr模块)

来源:欧宝平台    发布时间:2023-11-19 11:55:19 1
地址的处理。 对网络工程师来说,IP规划、划分子网、计算网络地址、掩码、主机号、广播号等,老司机应该都轻车熟路了。但是,人工、口算是非常容易出错的,加上IP网段规模较大的话,如果不借助点自动化的手

  地址的处理。 对网络工程师来说,IP规划、划分子网、计算网络地址、掩码、主机号、广播号等,老司机应该都轻车熟路了。但是,人工、口算是非常容易出错的,加上IP网段规模较大的话,如果不借助点自动化的手段,还是费时费力的。

  我知乎写作目录入口,如果你不知道从何读起,建议从这篇《目录》开始,链接如下:

  @惰惰猴猴哥早前就录了使用netaddr处理IP地址的视频分享。我也做了参考,本文也可以说是学习猴哥视频的一个笔记吧!你们可以移步猴哥的视频,给猴哥点个赞!

  IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。IP地址是IP协议提供的一种统一的地址格式,它为网络上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP地址有V4和V6两个版本,以下是我自己之前学习网络知识时用excel画的图。我们大体回忆一下。

  如果你用IDLE,此时可以用help或dir函数配合着官网信息去探索!如果此时你已进阶,使用了IDE(如Pycharm),可通过IDE的一些功能。(我再次建议初学者还是先用一段时间的原生态IDLE。)

  慢慢地,随着你Python学习渐入佳境,我建议可以多用“类和对象”方法来辅助理解,虽然编写脚本时依然可以用“面向过程”的思维去写写。

  如果你要知道怎么得到这个类,请再源码中找到__init__这个魔法方法。

  这种编程习惯非常规范,函数说明写得像小作文。如果你是专业程序员,是有相应的代码规范化要求的。但是,咱们是网络工程师,虽然可能达不到这种状态,依然可以借鉴借鉴!

  一旦你熟悉了这种源码写法,绝大部分Python第三方库都是这样的。这样我们探索源码就有了套路。

  要得到一个IPNetwork类,我们应该传入3个参数addr,version,flags(self不算)。其中,两个是有默认值了。这样我们如果最小启动的话,只需要一个参数即可addr。

  一般情况下,已经完善的模块会考虑很多种情形,远超我们日常使用的场景,所以我们应该提纲挈领,最小启动即可!

  我们通过摸索一下源码(或者官网文档也行),即可着手调试起来。这里我们分别构建了一个IPv4地址,一个IPv6地址。如果传输的IP地址非法,则Python会抛出异常!

  变量ip1是一个对象,IPAddress是一个类,dir(ip1)和dir(IPAddress)既有联系又有区别! 你们可以都测试一下,对比一下差别。

  大家可以挑一些试试看,此时可以稍微留意下属性(不用带小括号)和方法(需要带小括号)的区别。

  相对于IPAddress类,IPNetwork类则应用广泛一些,它可以灵活一些。

  你知道在Python交互模式下,直接敲变量名返回的内容,与调用print内置函数返回的内容,有些一致,有些不同。为什么呢?这个与魔法方法有关系!

  如果你使用了IDE(如Pycharm,我很喜欢用它),可以如下了解属性和方法。

  有了字符串类型数据后,就可根据字符串方法,正则表达式,TextFSM等做处理了。

  此时,我们用Python内置函数list处理成IPNetwork列表。如果你想得到网段信息文本,也能配合一下列表推导式。

  以上就是把192.168.2.0/24这一个C的网段划分成前缀为/27的网段。

  当网段拆分完成,我们大家可以使用iter_hosts方法,来获取这个网段内的可用主机地址。

  判断某个IP是否在一个网段中,我们大家可以用IPAddress类 in IPNetwork类的格式来完成。

  能拆分网段,自然也能做汇总,netaddr模块的cidr_merge函数为咱们提供解决方案。

  相信到这里你应该有点感觉了,IPRange类主要用户连续IP的处理。有时候一段IP地址可能不再某个网段范围内,或者网段划分复杂(比如有些/27下又再分,有些有没有!),但是它们是成片连续的。

  要实例化IPRange类,只需要给定start和end地址即可,接着会生成一个可迭代对象。

  此时,我们又可以用列表推导式来处理的,后续的操作就又回到IPAddress类的操作了,不再赘述。

  @惰惰猴猴哥在视频的后半部分,举了一个小例子,即如果从现网的配置或者命令回显中获取一个接口IP地址,如果通过这一个地址使用netaddr模块分离出地址和掩码,从而再获取网络号,主机地址,广播地址,掩码长度等信息,而后将这一些信息进行字符串化,最后拼接组合成预期的IP地址表示格式。推荐大家移步学习。

  无论MAC地址还是IP地址的处理,通常最后都锚定到字符串处理这个Python基础知识上来。因此,基础知识是很重要,如果你平时点空闲,也不知道做啥好,那就回归基础,夯实基础。当然,很多读者反馈,我的文章比较基础,适合零基础入门。我也尽量努力这么做。但是,我也得面向进阶读者。本文的一些内容,如列表推导式,如源码查阅等,是属于稍微进阶的内容了。

  相对于具体的知识,我更加倾向于分享“陌生第三方模块如何下手”的思路。希望你参考我的方法后,打磨出对自己最合适的方法,往后不管遇到哪个陌生的第三方模块,都能够最终靠自助探索一番后,启动着投入生产,产生效能。

  欢迎关注点赞收藏评论交流,如果觉得特别认可,可挑一篇最喜欢的打赏1元支持。感谢!

评论一舟