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

news2025/1/21 12:47:30

目录

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 time

ip = "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.coloradmin.cn/o/2279820.html

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

相关文章

Linux:进程概念详解

进程详解 一、冯诺依曼计算机体系(一)体系概念(二)计算机之间的数据传输 二、操作系统(一)操作系统设计的意义(二)操作系统的管理功能(三)系统调用的实质 三、…

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据!本次我们为大家带来的就是具体到气象监…

STM32之CubeMX图形化工具开发介绍(十七)

STM32F407 系列文章 - STM32CubeMX(十七) 目录 前言 一、CubeMX 二、下载安装 1.下载 2.安装 3.图解步骤 三、用户界面 1.项目配置 2.项目生成 3.项目文件解释 4.新建工程 5.查看原工程 四、FAQ 总结 前言 STMCube源自意法半导体&#xf…

top命令返回值有异常问题解决

异常问题:load average值不正常 排查思路: 1.找到是哪个进程引起的异常,看看是否有cpu占用过高或者mem占用过高的进程 再根据具体情况分析原因。 定位到异常进程后,首先打堆栈,留存现场日志,然后停止进…

sqlfather笔记

这里简单记录写学习鱼皮sqlfather项目的笔记,以供以后学习。 运行 将前后端项目clone到本地后,修改对应配置文件运行项目。 后端 1.配置好mysql后运行这个sql文件建立对应的表。 2.修改数据库密码 3.修改完后运行启动类即可 4. 启动结果 5.查看A…

【Axure高保真原型】数字滚动效果

今天和大家分享数字滚动效果的原型摸吧原型模板,效果包括: 在输入框输入目标数值后,点击滚动按钮,下方数字自动滚动到对应的数值; 在输入框输入初始数值后,点击设置初始值按钮,可以设置下方数字…

“AI人工智能内容辅助创作平台:让创意不再“卡壳”

在如今这个信息爆炸的时代,内容创作成了每个人的“必修课”。无论是自媒体大V、文案策划,还是普通学生写作文,大家都会遇到一个让人抓狂的问题——“创意枯竭”。有时候,脑袋里空空如也,一个字都写不出来,那…

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮,但是2025年更新之后这个按钮就不提供了,所以需要使用新的方式下载 ps:给自己的网站推广下~~(国内直连GPT/Claude) 新的下载方式1 首先打开vscode商店官网:vscode插件下载…

python——Django 框架

Django 框架 1、简介 Django 是用python语言写的开源web开发框架,并遵循MVC设计。 Django的**主要目的是简便、快速的开发数据库驱动的网站。**它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能…

搜索功能实现

前言 主要实现思路是全局监听点击事件的点击范围是否包含搜索结果内容。 效果 上代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initi…

两份PDF文档,如何比对差异,快速定位不同之处?

PDF文档比对是通过专门的工具或软件&#xff0c;自动检测两个PDF文件之间的差异&#xff0c;并以可视化的方式展示出来。这些差异可能包括文本内容的修改、图像的变化、表格数据的调整、格式的改变等。比对工具通常会标记出新增、删除或修改的部分&#xff0c;帮助用户快速定位…

K8S 亲和性与反亲和性 深度好文

今天我们来实验 pod 亲和性。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8-alpine docker pull nginx…

用户中心项目教程(五)---MyBatis-Plus完成后端初始化+测试方法

文章目录 1.数据库的链接和创建2.建库建表语句3.引入依赖4.yml配置文件5.添加相对路径6.实体类的书写7.Mapper接口的定义8.启动类的指定9.单元测试10运行时的bug 1.数据库的链接和创建 下面的这个就是使用的我们的IDEA链接这个里面的数据库&#xff1a; 接下来就是输入这个用户…

TL3562/3568移植无锡沐创N500L-AM4驱动进内核源码,报错及其解决方案

前言 创龙官方提供的资料无锡沐创N500L-AM4驱动是rnpgbe-0.1.0.rc60-dd9f3cf.tar.gz&#xff1b;无锡沐创官方&#xff0c;截止目前&#xff0c;最新驱动是rnpgbe-0.2.3-f26b9a4.tar.gz。考虑到开发的稳妥性&#xff0c;先选用创龙尝试过的rnpgbe-0.1.0.rc60-dd9f3cf.tar.gz来移…

CycleGAN - CycleGAN网络:无监督图像到图像转换的生成对抗网络

1. 背景与问题 在图像到图像转换任务中&#xff0c;传统的生成对抗网络&#xff08;GANs&#xff09;依赖于成对的训练数据来进行监督学习。然而&#xff0c;获得大量成对标注数据通常是昂贵且耗时的。在许多应用中&#xff0c;真实世界的标注数据往往是稀缺的&#xff0c;因此…

空间解析几何8:空间线段与圆锥侧面的最短距离【附MATLAB代码】

理论推导 matlab代码 function [dmin] distanceConeToLine (A1,B1,A2,B2,R) dmin 100000000; h norm(A2-B2); A B1(1)-A1(1); if(abs(A)<1e-2)A 1e-2; end B B1(2)-A1(2); if(abs(B)<1e-2)B 1e-2; end C B1(3)-A1(3); F A1(1)*CA*h-A1(3)*A; G A1(2)*CB*h-A1(…

K8S 集群搭建和访问 Kubernetes 仪表板(Dashboard)

一、环境准备 服务器要求&#xff1a; 最小硬件配置&#xff1a;2核CPU、4G内存、30G硬盘。 服务器可以访问外网。 软件环境&#xff1a; 操作系统&#xff1a;Anolis OS 7.9 Docker&#xff1a;19.03.9版本 Kubernetes&#xff1a;v1.18.0版本 内核版本&#xff1a;5.4.203-…

2024:成长、创作与平衡的年度全景回顾

文章目录 1.前言2.突破自我&#xff1a;2024年个人成长与关键突破3.创作历程&#xff1a;从构想到落笔&#xff0c;2024年的文字旅程4.生活与学业的双重奏&#xff1a;如何平衡博客事业与个人生活5.每一步都是前行&#xff1a;2024年度的挑战与收获6.总结 1.前言 回首2024年&a…

HTML<form>标签

例子 具有两个输入字段和一个提交按钮的HTML表单&#xff1a; <form action"/action_page.php" method"get"> <label for"fname">First name:</label> <input type"text" id"fname" name"f…

C++:输入3个整数,利用指针和函数,按由小到大的顺序输出。

输出样例如图所示&#xff1a; 代码如图&#xff1a; #include<iostream> using namespace std;void exchange(int* x, int* y){int temp;temp *x;*x *y;*y temp; }int main(){int a 0, b 0, c 0;int* p1 &a, * p2 &b, * p3 &c;cout << &quo…