Python网络自动化运维---SSH模块

目录

SSH建立过程 

实验环境准备 

一.SSH模块

1.1.Paramiko模块

1.1.1实验代码 

1.1.2代码分段讲解 

1.1.3代码运行过程 

1.2Netmiko模块

Netmiko模块对比paramiko模块的改进:

1.2.1实验代码

1.2.2代码分段讲解

1.2.3代码运行过程

二.Paramiko模块和Netmiko模块常用函数总结

Paramiko模块

Netmiko模块 


前言

        本章主要介绍Python中的SSH模块和框架在网络运维中的具体应用,所有实验均针对华为设备,在ensp模拟器上演示。


SSH建立过程 

详细了解SSH服务,请点击此处

抓包结果如下:

加密算法协商阶段

抓包结果如下: 

密钥交换阶段 :

点击此处详细了解DH算法

客户端发送DH密钥 

服务端发送DH公钥 

 

实验环境准备 

拓扑图:

    基础配置 

  •  路由器配置各接口IP
  • 本地电脑(Cloud模块)能够ping通路由器GE0/0/0接口的IP:192.168.223.10
  • 路由器开启SSH服务,并在本地电脑使用远程工具(如:XShell)成功连接

一.SSH模块

Python中主要支持SSH协议实现远程连接设备的模块主要有Paramiko和Netmiko两种。

1.1.Paramiko模块

        Netmiko模块是基于Paramiko模块的二次开发。一般来说,Netmiko对用户比较友好,容易上手,但有时候会增加额外开销,如内置主动延迟等,因此,多掌握些朴素的Paramiko模块,则Python自动化实施起来更加灵活。

        下面我们使用Paramiko模块来完成上面的拓扑实验来登录路由器并为他的loopback1端口配置IP地址1.1.1.1/32。

        Paramiko模块是一个第三方模块,需要手动安装,我使用的Python IDE工具Pycharm自动安装,如下图,鼠标放在未安装的模块下方红色波浪线处,自动弹出安装界面。

1.1.1实验代码 

import paramiko
import timeip = "192.168.223.10"
username = "zt"
password = "329161"
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=ip,username=username,password=password)print("Successfully connected to ",ip)
commend = ssh_client.invoke_shell()
commend.send("sys\n")
commend.send("int loop 1\n")
commend.send("ip address 1.1.1.1 255.255.255.255\n")
commend.send("return\n")
commend.send("save\n")
commend.send("Y\n")time.sleep(2)
output = commend.recv(65535)
print (output.decode("ascii"))
ssh_client.close()

1.1.2代码分段讲解 

模块导入部分

import paramiko
import time

 变量初始化部分

ip = "192.168.223.10"
username = "zt"
password = "329161"

SSH客户端创建与连接部分 

ssh_client = paramiko.SSHClient()
  •  调用Paramiko的SSHClient()方法创建一个SSH客户端,将其赋值给变量ssh_client。顾名思义,将本地电脑作为SSH客户端,而SSH服务端则是我们要登录的路由器。
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  • 在默认情况下,Paramiko会拒绝任何未知的SSH公钥(DH共享密钥),这里我们需要使用上面的代码让Paramiko接受SSH服务端提供的公钥,这是任何时候使用Paramiko都要用到的标准配置。
ssh_client.connect(hostname=ip,username=username,password=password)
  •  做完Paramiko关于SSH公钥的配置,调用Paramiko.SSHClient的conect()函数进行SSH登录
print("Successfully connected to ",ip)
commend = ssh_client.invoke_shell()
  •  SSH连接成功后,需要调用Paramiko.SSHClient()的invoke_shell()方法来唤醒华为设备的命令行,并将其复制给commend
commend.send("sys\n")
commend.send("int loop 1\n")
commend.send("ip address 1.1.1.1 255.255.255.255\n")
commend.send("return\n")
commend.send("save\n")
commend.send("Y\n")
  • 之后调用invoke_shell()的send()函数来向路由器“发送命令”,这里需要注意“\n”代表我们每次输入完命令后的回车执行过程。 
time.sleep(2)
output = commend.recv(65535)
print (output.decode("ascii"))
  • Python是一次性执行完所有脚本中的命令,中间没有间隔时间,这样会导致某些命令遗漏和回显内容不完整的问题,因此需要使用time模块中的sleep函数让Python休眠2s。
  • 这里的 commend.recv(65535)代表截取65535个字符回显内容,即Paramiko一次能截取的最大回显内容,Paramiko截取的回显内容为字节型字符串,需要使用decode("ascii")将其解码为ACCII编码。

1.1.3代码运行过程 

实验结果:

1.2Netmiko模块

          Netmiko模块是基于Paramiko模块的二次开发。一般来说,Netmiko对用户比较友好,容易上手,下面我们使用Netmiko模块来完成上面的拓扑实验来登录路由器并为他的loopback2端口配置IP地址2.2.2.2/32。

           Netmiko模块是第三方模块,需手动安装,安装方法和Paramiko模块一致,此处不再赘述。

Netmiko模块对比paramiko模块的改进:

对不同厂商设备支持方面:

  • paramiko 是一个通用的 SSH 库,它主要提供了基本的 SSH 连接和命令执行功能。
  • netmiko 内置了对多种网络设备厂商(如 Cisco、Juniper、Huawei 等)的支持,在函数 ConnectHandler 中通过 device_type 可以自动使用相应厂商的命令配置逻辑,无需担心不同厂商设备在命令语法、提示符等方面的差异。

 设备连接方面:

  • 在使用 paramiko 时,需要手动设置 SSHClient 对象,设置主机密钥策略,然后通过 connect 方法进行连接。
  • netmiko 使用 ConnectHandler 函数,通过一个包含设备信息的字典作为参数进行连接,更加简洁和直观。device_type 可以帮助 netmiko 针对不同厂商的设备使用不同的驱动,方便对不同厂商设备的操作。

命令配置发送方面

  • 使用 paramiko 发送多条配置命令时,需要手动调用 send 方法发送每条命令且命令后必须添加'''\n'参数来使python模拟回车操作。
  • netmiko 的 send_config_set 方法可以接收一个命令列表,将这些命令按顺序发送到设备上,并自动处理命令的输入确认即回车。
  • netmiko 内置不同厂商的驱动程序,这些程序包含了不同厂商设备的操作逻辑,包括如何进入和退出配置模式。例如对于华为设备,netmiko 会自动发送 quit 或 return 等命令(根据具体情况),让设备从系统视图回到用户视图,而不需要用户手动添加这些命令。

结果处理方面

  • 在 paramiko 中,需要使用 recv 方法接收数据,且需要手动指定接收的字节数,还需要使用 decode 方法进行解码,同时使用 time.sleep 来等待设备处理,防止Python一次性执行完所有脚本中的命令,中间没有间隔时间,导致某些命令遗漏
  • netmiko 的 send_config_set 方法会自动等待命令执行完成并返回执行结果,无需手动处理等待和接收字节的问题,结果处理更加方便和高效。

1.2.1实验代码

import netmiko
R1 = {'device_type': 'huawei','ip': '192.168.223.10','username': 'zt','password': '329161'
}ssh_client = netmiko.ConnectHandler(**R1)
print("Successfully connected to " + R1['ip'])config_commands = ['interface Loopback2', 'ip address 2.2.2.2 255.255.255.255']
output = ssh_client.send_config_set(config_commands)
print(output)save_output = ssh_client.send_command_timing('save')
#上述代码也可用下面的代码替代
#output = ssh_client.send_command('save', expect_string='Are you sure to continue')
if "Are you sure to continue" in save_output:confirm_output = ssh_client.send_command_timing("yes")print(confirm_output)print("Successfully to save config...")
ssh_client.disconnect()

1.2.2代码分段讲解

import netmiko
  • 导入 netmiko 库,以便使用其功能 
R1 = {'device_type': 'huawei','ip': '192.168.223.10','username': 'zt','password': '1234'
}
  • 创建一个包含设备信息的字典,其中 device_type 表示设备类型,ip 是设备的 IP 地址,username 和 password 是登录凭证 
ssh_client = netmiko.ConnectHandler(**R1)
print("Successfully connected to " + R1['ip'])
  • 使用 ConnectHandler 函数建立与设备的连接,**R1 是将字典中的键值对作为关键字参数传递,并打印连接成功的消息
config_commands = ['interface Loopback2', 'ip address 2.2.2.2 255.255.255.255']
output = ssh_client.send_config_set(config_commands)
print(output)
  •  创建一个名为config_commands的列表,其元素为需要在交换机上依次执行的命令
  • 然后以刚创建的命令列表为参数,调用ConnectHandler()的send_config_set()函数来使用命令列表中的命令对设备做配置,并将配置过程打印出来

:除了我们代码里写的命令,send_config_set函数额外替我们输入了 2个命令,一个是"system-view",一个是“return”,详情查看下方代码配置过程图片

save_output = ssh_client.send_command_timing('save', read_timeout=30)
print(save_output)if "Are you sure to continue" in save_output:confirm_output = ssh_client.send_command_timing("yes", read_timeout=30)print(confirm_output)
  • 使用 send_command_timing 方法发送 save 命令,read_timeout 参数设置读取超时时间为 30 秒,存储输出结果。
  • 检查 save 命令的输出中是否包含确认信息,如果包含确认信息,发送yes命令保存配置

注意:使用save命令保存配置时,由于send_config_set函数会发送system-view命令从而自动进入系统视图,而save命令在系统视图下无法使用,因此需使用send_command_timing函数进行异步发送save命令保存配置。

1.2.3代码运行过程

 实验结果:

二.Paramiko模块和Netmiko模块常用函数总结

Paramiko模块

创建SSH客户端
paramiko.SSHClient()创建SSH连接
paramiko.SSHClient.connect()必要参数:hostname,ip,username,password打开设备的命令行界面
paramiko.SSHClient.invoke_shell()向对端设备发送命令
paramiko.SSHClient.invoke_shell.send()设备客户端paramiko模块能够接受的最大字节数
paramiko.SSHClient.recv(65535)自动接受SSH服务端的公钥
paramiko.SSHClient.set_missing_host_key_policy(paramiko.AutoAddPolicy())

Netmiko模块 

创建一个SSH客户端连接,函数中的参数为SSH服务端的主机名/IP/账户/密码等信息
netmiko.ConnectHandler(**R1)向SSH服务端发送一组配置命令,其参数为命令列表
netmiko.ConnectHandler.send_config_set()向SSH服务端发送单个配置命令,适用于需要交互的命令,因为它会自动根据设备的输出提示符来判断命令是否执行完成。
netmiko.ConnectHandler.send_command_timing

总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Esxi下虚拟机磁盘类型厚置备改精简置备

Esxi虚拟机磁盘类型厚置备改精简置备 一、esxi报错磁盘不足 1.1、虚拟机报错磁盘不足 1.2、虚拟机磁盘类型 VMware vSphere 中有两种主要类型的虚拟硬盘:精简配置磁盘和厚置备磁盘。 厚置备磁盘有两种分配模型:厚置备延迟置零和厚置备置零。 三者比…

【MySQL系列文章】Linux环境下安装部署MySQL

前言 本次安装部署主要针对Linux环境进行安装部署操作,系统位数64 getconf LONG_BIT 64MySQL版本:v5.7.38 一、下载MySQL MySQL下载地址:MySQL :: Download MySQL Community Server (Archived Versions) 二、上传MySQL压缩包到Linuxx环境&#xff0c…

HTML 表单和输入标签详解

HTML 表单是网页与用户交互的重要工具,它允许用户输入数据并将其提交到服务器。表单在网页中的应用非常广泛,例如登录、注册、搜索、评论等功能都离不开表单。本文将详细介绍 HTML 表单及其相关标签的使用方法,帮助你全面掌握表单的设计与实现…

2024年,我的技术探索与成长之路

2024年,我的技术探索与成长之路 2024年已经过去,作为一名技术爱好者和写作者,我回顾了过去一年在博客上记录的点滴,感慨良多。这一年,我不仅见证了技术的飞速发展,也在不断学习和实践中找到了自己的成长方向…

《Long Context Compression with Activation Beacon》笔记

Activation Beacon出自智源与人大在2024年1月放在arxiv上的论文《Long Context Compression with Activation Beacon》(v1版的题目:Soaring from 4K to 400K: Extending LLM’s Context with Activation Beacon)。它引入了Beacon token将上下文信息蒸馏到…

Jupyter notebook中运行dos指令运行方法

Jupyter notebook中运行dos指令运行方法 目录 Jupyter notebook中运行dos指令运行方法一、DOS(磁盘操作系统)指令介绍1.1 DOS介绍1.2 DOS指令1.2.1 DIR - 显示当前目录下的文件和子目录列表。1.2.2 CD 或 CHDIR - 改变当前目录1.2.3 使用 CD .. 可以返回上一级目录1…

基于注解实现去重表消息防止重复消费

基于注解实现去重表消息防止重复消费 1. 背景/问题 在分布式系统中,消息队列(如RocketMQ、Kafka)的 消息重复消费 是常见问题,主要原因包括: 网络抖动:生产者或消费者因网络不稳定触发消息重发。消费者超…

Biotin sulfo-N-hydroxysuccinimide ester ;生物素磺基-N-羟基琥珀酰亚胺酯;生物素衍生物;190598-55-1

一、生物素及其衍生物的概述 生物素衍生物是指在生物素(Vitamin H或B7)分子基础上进行化学修饰得到的衍生化合物。这些衍生化合物在生物医学研究、临床诊断和药物开发等领域有着广泛的应用。 生物素(Biotin)是一种水溶性维生素&a…

Ubuntu如何安装redis服务?

环境: Ubuntu22.04 WSL2 问题描述: 如何安装redis服务? 解决方案: 1.在 Linux 上(如 Ubuntu/Debian)安装 1.通过包管理工具安装 Redis 服务器: sudo apt update sudo apt install redis…

Datawhale组队学习笔记task2——leetcode面试题

文章目录 写在前面Day5题目1.0112.路径总和解答2.0113路径总和II解答3.0101.对称二叉树解答 Day6题目1.0124.二叉树中的最大路径和解答2.0199.二叉树的右视图解答3.0226.翻转二叉树解答 Day7题目1.0105.从前序与中序遍历序列构造二叉树解答2.0098.验证二叉搜索树解答3.0110.平衡…

Flask简介与安装以及实现一个糕点店的简单流程

目录 1. Flask简介 1.1 Flask的核心特点 1.2 Flask的基本结构 1.3 Flask的常见用法 1.3.1 创建Flask应用 1.3.2 路由和视图函数 1.3.3 动态URL参数 1.3.4 使用模板 1.4 Flask的优点 1.5 总结 2. Flask 环境创建 2.1 创建虚拟环境 2.2 激活虚拟环境 1.3 安装Flask…

RFID系统安全认证协议及防碰撞算法研究(RFID Security)

目录 1.摘要 2.引言 3.前人研究成果 3.1 RFID系统协议模型 3.2 RFID系统安全认证协议分类 3.3 RFID安全认证协议及其研究 3.3.1 超轻量级安全认证协议及其研究 3.3.2 轻量级安全认证协议及其研究 3.3.2 中量级安全认证协议及其研究 3.3.3 重量级安全认证协议及其研究…

Docker 实现MySQL 主从复制

一、拉取镜像 docker pull mysql:5.7相关命令: 查看镜像:docker images 二、启动镜像 启动mysql01、02容器: docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql -e MYS…

Spring MVC:设置响应

目录 引言 1. 返回静态页面 1.1 Spring 默认扫描路径 1.2 RestController 1.2.1 Controller > 返回页面 1.2.2 ResponseBody 2. 返回 HTML 2.1 RequestMapping 2.1.1 produces(修改响应的 Content-Type) 2.1.2 其他属性 3. 返回 JSON 4. 设置状态码 4.1 HttpSer…

基于python+Django+mysql鲜花水果销售商城网站系统设计与实现

博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

提示词的艺术----AI Prompt撰写指南(个人用)

提示词的艺术 写在前面 制定提示词就像是和朋友聊天一样,要求我们能够清楚地表达问题。通过这个过程,一方面要不断练习提高自己地表达能力,另一方面还要锻炼自己使用更准确精炼的语言提出问题的能力。 什么样的提示词有用? 有…

Spring Boot自动配置原理:如何实现零配置启动

引言 在现代软件开发中,Spring 框架已经成为 Java 开发领域不可或缺的一部分。而 Spring Boot 的出现,更是为 Spring 应用的开发带来了革命性的变化。Spring Boot 的核心优势之一就是它的“自动配置”能力,它极大地简化了 Spring 应用的配置…

大模型GUI系列论文阅读 DAY2续2:《使用指令微调基础模型的多模态网页导航》

摘要 自主网页导航的进展一直受到以下因素的阻碍: 依赖于数十亿次的探索性交互(通常采用在线强化学习),依赖于特定领域的模型设计,难以利用丰富的跨领域数据进行泛化。 在本研究中,我们探讨了基于视觉-语…

在视频汇聚平台EasyNVR平台中使用RTSP拉流的具体步骤

之前有用户反馈,在EasyNVR平台中添加Pull时使用海康设备的RTSP流地址无法播放。经过研发的优化及一系列严谨的验证流程,我们已确认优化后的EasyNVR平台,通过Pull方式添加海康设备的RTSP流已经能够正常播放。以下是具体的操作步骤:…

Debezium日常分享系列之:对于从Oracle数据库进行快照的性能优化

Debezium日常分享系列之:对于从Oracle数据库进行快照的性能优化 源数据库Kafka Connect监控测试结果 源数据库 Oracle 19c,本地,CDB数据库主机的I/O带宽为6 GB/s,由此主机上运行的所有数据库共享临时表空间由42个文件组成&#x…