皮皮网
皮皮网

【宿主机架源码】【驾校考试源码】【发帖机源码】telnet 源码分析

来源:lzma 源码下载 发表时间:2024-11-30 13:42:23

1.【自动化运维初级村】Paramiko vs Netmiko
2.Arthas 源码阅读
3.增强Spring改造@CacheEvict,源码支持缓存批量模糊删除!分析

telnet 源码分析

【自动化运维初级村】Paramiko vs Netmiko

       秉承着“最小化上手范围”的源码原则,相信大家经过新手村二十多个章节的分析学习,都已经对Python有了初步的源码了解,基础的分析宿主机架源码学习必然是略显枯燥无聊的,但希望大家可以在“新手村”系列视频和文章的源码指导下有自己阅读程序,分析需求,分析编写程序,源码调试程序的分析基本技能。

       以上也是源码进入初级村的最低门槛,如果还没有具备上述能力的分析朋友,衷心的源码希望你可以返回新手村进行学习,切勿囫囵吞枣,分析盲目求快。源码

       初级村包含的内容:Paramiko和Netmiko,两者的使用方式及优劣;Python正则解析,将通过SSH收集回来的各种信息进行正则解析;番外:Text-FSM解析;Python SNMP,如何使用Python调用SNMP采集指令,并讲解OID使用方式;NetConf,驾校考试源码如何通过NetConf对网络设备进行操作;Crontab并回调CMDB,如何设置定时执行SSH任务进行定期巡检,并更新回写CMDB;番外:Python Scheduler;Flask Web框架,将SSH和NetConf与Web框架相结合,通过API方式或前端调用其执行。

       在自动化运维领域里面,单从服务器运维的角度来讲,由于可以提前对服务器做系统的定制安装,所以一些大厂会选择在装机时植入特定的Agent,以此实现远程控制服务器的目的。不过对于大部分的公司,服务器运维或者网络设备运维都仍然依靠远程SSH这一方法,所以我们使用Python作为自动化运维的编程语言的话,就非常需要一个第三方包来实现这一功能,而Paramiko和Netmiko可以说是扛把子的角色。相信看这个教程的朋友肯定都听过这两个工具包,但可能并不是所有的人都了解这两个包之间的关系。除此之外,网上五花八门的发帖机源码对于用哪个更好的争论也难以分辨。那么这个章节就先给大家介绍一下这两个包的来龙去脉,以及我个人在工作中对两个包都深度使用过之后的体验。

       OpenSSH,介绍第三方库之前有必要先科普一下关于SSH的知识。我们经常谈论的SSH是一个传输层协议,相比Telnet来说可以与远端设备建立更安全的连接通道,对传输的内容进行加解密处理,所以基于安全考虑,企业中几乎所有的对远程设备的连接都要求使用SSH连接。

       SSH协议有两种不兼容的版本:SSHv1和SSHv2。那么设备想要支持SSH协议,就需要在设备上安装一个与之相匹配的服务端/客户端的应用程序,而OpenSSH就是目前使用最为广泛的SSH协议的开源实现。

       对于较老的SSHv1,由于存在加密算法的专利问题和数据完整性的缺陷,OpenSSH已经删除了对其的支持。所以目前OpenSSH主要支持SSHv2。

       OpenSSH套件包含以下工具:

       整体的结构图如下所示:

       Paramiko/Netmiko简介:Paramiko遵循SSH2协议,支持以加密和认证的学校班级源码方式,进行远程服务器的连接;模块本身使用Python语言编写和开发,只有像crypto这样的核心函数才会用到C语言。

       Paramiko目前是Python中应用最广的SSH模块,大家耳熟能详的Ansible, Netmiko,Nornir,NAPALM其实都是用到了Paramiko来做SSH的实现,所以也可以从中看出,其实Paramiko的角色其实是Python语言里实现SSH功能的底层工具包。

       那么既然是底层工具包就必然为了具备完备的通用性而损失了易用性,而Paramiko过于底层的方法调用也是被网友最为诟病的原因。

       但我们已经提到,Python想要实现SSH远程连接,就逃不开Paramiko,那么我们就非常有必要了解一下Paramiko的基本实现原理和主要的组成类。

       源码核心架构图:Paramiko中几个大的概念和相互之间的关系基本就是如上图所示了(一些身份认证类和其他杂类并没有包含其中,在学习初期也没有深究这些的必要)。

       总体来说Paramiko的源码核心架构并不复杂,但对于使用该包的超级商城源码编程人员来说,暴露了太多底层细节。因为其最High-Level的类就是一个SSHClient对象,而一个SSHClient对象又必须通过创建Channel来完成数据的收发。

       所以说Paramiko其实就是一个实现了SSH功能的底层工具包,它可以连接任何兼容SSHv2的设备,包括:服务器,网络设备,打印机,甚至是监控摄像头,并且它最核心的功能就是:建立SSH连接 -> 发数据 -> 收数据。

       Netmiko:但看本系列的教程的朋友应该大多数都是具备网络运维背景的朋友,想实现一些网络运维中的自动化能力,那么平时所要面对的就都是网络设备,我这里推荐大家使用Netmiko。

       我们可以通过一个流程图来表示一下除了Paramiko本身的底层能力外,还需要哪些步骤才能完成一次与网络设备的交互。

       交互流程图:从上述的流程图中可以看出,除了Paramiko支持的底层SSH连接与数据发送接收功能之外,我们想要与网络设备进行交互还需要诸多地方需要处理,而Netmiko正好可以提供以上这些功能,这也是我们为什么选择用Netmiko的原因。

       其实网上有很多文章都有对Paramiko和Netmiko的对比,但大多数的解释都不够准确,并且还有很多直接通过代码来演示区别的,更是让一些编程基础不太好的朋友十分头疼,所以我希望大家可以通过这一章节,非常清晰的知道,两者之间的区别究竟有哪些。

       这一章节并没有提到关于使用Paramiko或者Netmiko来进行连接设备的代码,但对Paramiko的源码核心架构做了介绍,这也是大家后续使用Netmiko必须要掌握的基础知识,并且对于Netmiko基于Paramiko的改进也通过流程图展示给大家,对后续的深入理解及二次开发会非常有帮助。

Arthas 源码阅读

       Arthas源码阅读的核心逻辑主要集中在arthas-agent的启动流程中,首先通过java -jar arthas-core.jar执行,然后Bootstrap获取Instrumentation并进行初始化。Server启动后,通过TelnetClient发送命令到Server,由CommandResolver解析并执行,如thread命令的执行过程。

       在启动阶段,用户输入会被TelnetConsole接收并由ShellServer解析,通过TermServerTermHandler处理,包括常用的HttpTelnetTermServer和HttpTermServer(基于Netty)。例如,ThreadCommand的process方法负责处理thread命令的具体逻辑。

       获取JVM信息通过JvmCommand,Watch接口通过EnhancerCommand实现,利用字节码增强技术(如EnhanceWatchAdviceListener)收集方法运行时信息。Profiler逻辑则涉及一个二进制工具,具体使用方法可参考相关文档。

       在实际问题解决上,Arthas提供了两种操作方式:一是通过命令行选项--command指定多条命令,适用于非持续监控场景;二是利用HTTP API进行远程控制,如Arthas Tunnel,适用于需要动态控制进程的场景,如管理多个Agent。

       此外,深入理解Consumer的completionHandler,如Termd Demo中的ReadLine部分,有助于更好地掌握Arthas的交互机制。

增强Spring改造@CacheEvict,支持缓存批量模糊删除!

       在开发中,遇到一个需要批量模糊删除特定租户缓存的需求。常规的使用方式包括使用@CacheEvict注解清除指定的缓存key或全部缓存。然而,当需要按照租户的唯一TelnetID进行缓存分离时,常规的allEntries = true清空namespace下的所有元素方式已不再适用。因为这种操作将导致所有缓存数据清空,不符合需求。

       为了实现批量模糊删除,需要深入理解@CacheEvict注解的实现原理。通常,@CacheEvict是通过AOP(面向切面编程)实现的,核心类是CacheAspectSupport,其内部方法负责缓存的清理。通过对CacheAspectSupport类的源码分析,我们可以发现缓存清理的逻辑主要在processCacheEvicts方法中,该方法通过调用performCacheEvict方法进行实际的缓存清理。

       在processCacheEvicts方法中,performCacheEvict方法负责调用RedisCache类的evict和clear方法进行缓存清理。当allEntries为true时,调用的是clear方法,该方法以namespace:: *作为key规则进行模糊删除。这一发现为实现批量模糊删除提供了可能,我们可以通过修改evict方法,在namespace *中插入特定的TelnetID,从而实现目标。

       为了实现这一需求,需要重写RedisCache类中的evict方法,并集成RedisCache。同时,为了确保定制的RedisCacheResolver生效,需要将其注入到RedisCacheManager中。这涉及定义一个自定义的RedisCacheManagerResolver类,集成RedisCacheManagerResolver实现。

       在完成RedisCacheResolver的实现后,只需要在RedisConfig中管理自定义的RedisCacheManagerResolver。至此,批量模糊删除特定租户缓存的需求已得到解决。

       通过以上步骤,不仅实现了使用自定义注解进行模糊删除缓存,还深入理解了Spring Cache的实现机制,进一步优化了缓存管理流程。这一技术进阶策略不仅适用于当前问题的解决,也为未来的缓存优化提供了参考。

相关栏目:焦点