Python自动化运维实战——Telnetlib和Netmiko自动化管理网络设备

❤️博客主页 iknow181
🔥系列专栏 PythonJavaSEJavaWebCCNP
🎉欢迎大家点赞👍收藏⭐评论✍


在这里插入图片描述

目录

一、前言

二、准备工作

三、Telnetlib

Telnetlib介绍

Telnetlib模块及操作方法介绍

Telnetlib配置设备

Telnetlib批量化部署多台设备

Telnetlib抓取设备配置

四、Netmiko

Netmiko介绍

Netmiko登陆设备并配置

Netmiko配置设备

Netmiko以文件方式配置设备

Netmiko抓取设备配置

Netmiko抓取设备配置并写入文件中

Netmiko批量化部署多台设备

Netmiko批量化抓取设备配置


一、前言

本期小i为大家带来了关于Python自动化运维的技术——利用Python进行网络设备的自动化管理。话不多说,直接上干货!


二、准备工作

在开始之前先做好准备工作,我用的是VMware这款虚拟机和EVE模拟器结合来模拟本次所需要的网络设备,没有VMware和EVE的小伙伴可以参考这两篇文章进行安装。

EVE模拟器的使用-带图超详细(学网络用)_eve虚拟机-CSDN博客

安装虚拟机(VMware)保姆级教程(附安装包)_vmware虚拟机-CSDN博客

先打开VMware,注意两个网络适配器中必须有一个是VMnet1,

确定好之后,点击继续运行此虚拟机。

然后打开EVE,新建一个实验,拖三台路由器,最好用vIOS

再添加一个Network,右击鼠标,点Network选项,

类型选Cloud0

将四台设备连线后开机,如下图。

然后为三台路由器配置ip地址,Net不用配,
注意:这里的ip地址是有讲究的,前24网络位为必须和你的虚拟机的IP网络一致(这就是为什么前面必须用VMnet1),后8位主机位随意,只要不是0,1,2等特殊地址就行,这里我选用188,189,190作为主机位。不清楚你的虚拟机网络地址的可以看EVE的网址。

vIOS1: 

enable
configure terminal
hostname R1
interface G0/0
ip address 192.168.254.188 255.255.255.0
no shutdown

vIOS2:

en
conf t
host R3
int G0/0
ip add 192.168.254.189 255.255.255.0
no sh

vIOS3:

en
conf t
host R3
int G0/0
ip add 192.168.254.190 255.255.255.0
no sh

配完后可以用本机ping一下这些设备,看能不能通。 

按win + R,输入cmd,进入命令行窗口,输入 ping 192.168.254.188

 

最后为设备配置telent和ssh,因为Telnetlib和Netmiko分别基于telent和ssh实现连接的。

下面我就以一台设备为例做配置。

telent

en
conf t
username admin privilege 15 password admin
line vty 0 4
tran in telnet
login local

ssh

en
conf t
ip domain-name cisco.com
crypto key generate rsa modulus 1024
line vty 0 4
transport input ssh

另外还需在PyCharm中导入TelnetlibNetmiko库,

Telnetlib直接导入就可以,

import telnetlib

Netmiko则需要先下载软件包,打开文件(file)中的设置(setting),找到项目:Project下的Python解释器,点击加号

在输入框中输入Netmiko,点击第一个选项netmiko,安装软件包即可。

注意:下载时必须保证一个好的网速,不然会非常慢且容易断开下载从而下载失败。

自此我们的准备工作就全部完成了,下面开始上代码!!!

三、Telnetlib

Telnetlib介绍
Telnetlib模块是Python提供的可用于Telnet连接使用的模块,值得注意的是,在现有的生产环境中,Telnet协议连接已经使用的较为少见了(原因也非常简单,Telnet协议是明文传输的协议,所以在数据传输,尤其是在公网上传输的时候极其不安全)。
​
且telnetlib已逐渐弃用,并计划在Python 3.13 版本中删除

Telnetlib模块及操作方法介绍
1. Telnet(host=None, port=0, timeout=None):Telnet类的构造函数,用于创建一个Telnet对象。参数host是远程主机的地址,port是远程主机的端口号,timeout是连接超时时间。
​
2. open(host, port=23, timeout=None):打开一个Telnet连接。参数host和port与Telnet构造函数中的相同。
​
3. read_until(expected, timeout=None):读取输入直到遇到预期的字符串。参数expected是预期的字符串,timeout是读取超时时间。
​
4. read_very_eager():读取输入缓冲区中的所有数据,不会阻塞。
​
5. write(data):向远程主机发送数据。参数data是要发送的数据。
​
6. close():关闭Telnet连接。
​
7. set_debuglevel(level):设置调试级别,用于输出调试信息。
​
8. set_option_negotiation_callback(callback):设置选项协商回调函数。
​
9. expect(list, timeout=None):等待预期的字符串出现,返回匹配的字符串。参数list是一个字符串列表,每个字符串表示一个预期的字符串,timeout是等待超时时间。
​
10. expect_regexp(list, timeout=None):等待预期的正则表达式出现,返回匹配的字符串。参数list是一个正则表达式列表,每个正则表达式表示一个预期的字符串,timeout是等待超时时间。
​
11. set_echo(option):设置是否回显输入。
​
12. set_timeout(timeout):设置读取超时时间。
​
13. set_option_negotiation_callback(callback):设置选项协商回调函数。
​
14. set_option_negotiation_callback(callback):设置选项协商回调函数。
Telnetlib配置设备
import telnetlib
​
host = '192.168.2541.188'  # 要远程管理的主机,确保IP可达,telnet服务打开
username = 'admin'  # telnet的用户名
password = 'admin'  # telnet的密码
​
tn = telnetlib.Telnet(host)  # 调用telnetlib的Telnet(),赋值给tn
tn.read_until(b"Username:")  # b表示等待期望的字符出现
tn.write(username.encode("ascii") + b"\n")  # 通过tn.write()的方式输入用户名,b/n表示回车
tn.read_until(b"Password:")   # b表示等待期望的字符出现
tn.write(password.encode("ascii") + b"\n")  # 通过tn.write()的方式输入密码,b/n表示回车
​
# 通过write函数输入配置命令
tn.write(b"enable\n")
tn.write(b"configure terminal\n")
tn.write(b"username CCIE password CCIE\n")
tn.write(b"end\n")
tn.write(b"wr\n")
tn.write(b"exit\n")
​
print(tn.read_all().decode("ascii"))  # 通过read_all()方法记录配置命令的过程
并且可以在EVE中看到相应的日志信息,代表192.168.254.1这个用户连接了此设备。​# 优化部分:通过函数调用的形式
import telnetlib
​
​
def run_telnet(host, username, password):# 通过Telnet登录网络设备tn = telnetlib.Telnet(host, port=23, timeout=10)
​# 输入用户名tn.read_until(b"Username:")tn.write(username.encode("ascii") + b"\n")
​# 输入密码tn.read_until(b"Password:")tn.write(password.encode("ascii") + b"\n")
​# 登录完成后执行命令tn.write(b"enable\n")tn.write(b"configure terminal\n")tn.write(b"username CCIECLUB privilege 15 password CCIECLUB\n")tn.write(b"end\n")tn.write(b"exit\n")tn.write(b"wr\n")
​print(tn.read_all().decode("ascii"))
​
​
run_telnet('192.168.254.188', "admin", "admin")
run_telnet('192.168.254.189', "admin", "admin")
run_telnet('192.168.254.190', "admin", "admin")
Telnetlib批量化部署多台设备
import telnetlib
​
​
def run_telnet(host, username, password, commands):# 通过Telnet登录网络设备tn = telnetlib.Telnet(host, port=23, timeout=10)tn.set_debuglevel(1)
​# 输入用户名tn.read_until(b"Username:")tn.write(username.encode("ascii") + b"\n")
​# 输入密码tn.read_until(b"Password:")tn.write(password.encode("ascii") + b"\n")
​# 登录完成后执行命令for command in commands:tn.write(command.encode("ascii") + b"\n")
​print(tn.read_all().decode("ascii"))tn.close()
​
​
commands = ['enable', 'configure terminal', 'username CCIE password CCIE', 'end', 'exit']
run_telnet('192.168.254.220', "admin", "admin", commands)
run_telnet('192.168.254.221', "admin", "admin", commands)
run_telnet('192.168.254.222', "admin", "admin", commands)
Telnetlib抓取设备配置

堪称写实验报告神器,一键导出配置到一个txt文档,告别手动一个一个的show,display。

import telnetlib
import time
​
​
def run_telnet(host, username, password):# 通过Telnet登录网络设备tn = telnetlib.Telnet(host, port=23, timeout=10)
​# 输入用户名tn.read_until(b"Username:")tn.write(username.encode("ascii") + b"\n")
​# 输入密码tn.read_until(b"Password:")tn.write(password.encode("ascii") + b"\n")
​# 登录完成后执行命令tn.write(b"enable\n")tn.write(b"terminal length 0\n") # 取消分段显示time.sleep(1)tn.write(b"show running-config\n")time.sleep(5)
​out = tn.read_very_eager().decode("ascii")print(out)
​file = open(file="E:\\1.txt", mode='a')file.write(out)file.close()
​tn.close()
​
​
run_telnet('192.168.254.188', "admin", "admin")
run_telnet('192.168.254.189', "admin", "admin")
run_telnet('192.168.254.190', "admin", "admin")

这边结果太长了我就不贴出来了。

四、Netmiko

Netmiko介绍
Netmiko是一款Python库,被广泛用于自动化网络设备管理任务。作为一个重要的开源库,它通过简化与网络设备的TCP连接,实现了快速执行相关任务的能力。Netmiko基于Paramiko库的基础架构,支持绝大多数的网络设备,包括Cisco, Juniper, Arista等。它提供了连接网络设备并执行特定任务的接口,例如SSH, Telnet以及串口这些网络协议的相关处理。
​
Netmiko在 Github 上是开源的,它的源代码可以在 GitHub 网站上进行获取和修改。Netmiko 项目的 GitHub 地址为:https://github.com/ktbyers/netmiko
Netmiko登陆设备并配置
from netmiko import ConnectHandler    # 导入函数,通过该函数实现SSH登录网络设备
​
# 创建字典,Netmiko支持多厂商,Arista、Cisco、HP、Juniper、Huawei、Extreme等主流厂商
# 同时,Netmiko支持不同平台的网络设备,如Cisco的IOS、Cisco IOS-XE、Cisco ASA、Cisco NX-OS
​
​
R1 = {"device_type": "cisco_ios",    # 由于不同厂商的设备在登陆后命令行特性不一致,需要通过"device_type"来指定登陆设备的类型"ip": "192.168.254.188",    # 远端主机IP"username": "admin",     # SSH登录到远端主机使用的用户名"password": "admin"    # SSH登录到远端主机使用的密码
}
​
with ConnectHandler(**R1) as connect:print("Successfully connected to" + " " + R1["ip"])    # 打印连接成功result = connect.send_command("show ip int b")    # send command()只支持向设备发送一条命令,一般来说是show/display类的查询命令,用于查看设备的某些信息。当此命令发出后,该函数会一直等待,直到收到设备完整的回显内容为止。如果在一定时间内依然没有读到完整的回显内容,Netmiko则会返回一个OSErrorprint(result)
Netmiko配置设备
from netmiko import ConnectHandler
​
R1 = {"device_type": "cisco_ios","ip": "192.168.2541.188","username": "admin","password": "admin"
}
with ConnectHandler(**R1) as connect:print("Successfully connected to" + R1["ip"])commands = ['interface g0/0', "description This is a physical interface"]result = connect.send_config_set(commands)print(commands)
​
# send_config_set():用于向设备发送一条或多条配置命令,此处一定是配置命令,因为send_config_set()本身会自动加上configure terminal命令进入配置模式(在结束的时候也会自动加上end),因此,如果要在此时使用show等查看命令,需要在前面加上do(如: do show ip interface brief),否则会无效。
# send_config_set()一般搭配列表来使用
​
from netmiko import ConnectHandler
​
R1 = {"device_type": "cisco_ios","ip": "192.168.254.188","username": "admin","password": "admin"
}
with ConnectHandler(**R1) as connect:print("Successfully connected to " + R1["ip"])commands = ['do sh ip int b']result = connect.send_config_set(commands)print(result)
Netmiko以文件方式配置设备

首先在当前目录下(使用的相对路径)创建一个txt文本——Lab,在里面写入需要执行的命令。

do show ip int b

from netmiko import ConnectHandlerR1 = {"device_type": "cisco_ios","ip": "192.168.254.188","username": "admin","password": "admin"
}
with ConnectHandler(**R1) as connect:print("Successfully connected to " + R1["ip"])File_configure = connect.send_config_from_file("Lab.txt")     # 相对路径print(File_configure)# connect.send_config_from_file():在配置命令数量较多的时候,将所有配置命令都填入列表中会显得列表很臃肿,因为代码过长,所以导致可读性变差、还会有可能出现设备超时的情况。所以我们可以先把所有的配置命令写入一个配置文件中,然后使用send_config_from_file()去读取该文件的内容帮助我们完成配置。# 和send_config_set()一样,send_config_from_file()也会自动的去添加"configure terminal"和 "end"命令,所以直接写要配置的命令就可以
Netmiko抓取设备配置
from netmiko import ConnectHandler
​
R1 = {"device_type": "cisco_ios","ip": "192.168.254.188","username": "admin","password": "admin"
}
with ConnectHandler(**R1) as connect:print("Successfully connected to " + R1["ip"])running_config = connect.send_command("show running-config")print(running_config)
Netmiko抓取设备配置并写入文件中
from netmiko import ConnectHandler
​
R1 = {"device_type": "cisco_ios","ip": "192.168.254.188","username": "admin","password": "admin"
}
with ConnectHandler(**R1) as connect:print("Successfully connected to " + R1["ip"])running_config = connect.send_command("show running-config")print(running_config)
​file = open(file="R1_config.txt", mode="a")    # 以写的方式打开文件file.write(running_config)file.close()
Netmiko批量化部署多台设备
from netmiko import ConnectHandler
​
host = {"192.168.254.188","192.168.254.189","192.168.254.190",
}
​
for ip in host:Router = {"device_type": "cisco_ios","ip": ip,"username": "admin","password": "admin"}with ConnectHandler(**Router) as connect:print("Successfully connected to " + Router["ip"])command = ["username abc password abc"]run_command = connect.send_config_set(command)print(run_command)
Netmiko批量化抓取设备配置
在lab.txt文本中写入需要抓取的目标设备IP
192.168.254.188
192.168.254.189
192.168.254.19
from netmiko import ConnectHandler
​
f = open("Lab.txt", mode='r')
for ips in f.readlines():ip = ips.strip()Router = {"device_type": "cisco_ios","ip": ip,"username": "admin","password": "admin"}with ConnectHandler(**Router) as connect:print("Successfully connected to " + Router["ip"])running_config = connect.send_command("show running-config")print(running_config)
​# 写入文件中backup_file_name = open(file="backup.txt", mode='a')backup_file_name.write(running_config)

在这里插入图片描述

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

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

相关文章

无人机遥控中应用的2.4GHz无线芯片

无人驾驶飞机简称“无人机”,英文缩写为“UAV”,是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞机,或者由车载计算机完全地或间歇地自主地操作。是一种不需要人操控就能够自主飞行的飞行器,它可以执行多种任务&#xff…

温湿度监测技术又进化了,这个操作太牛了!

无论是在家庭、医疗、农业、制造业,还是在物流和食品行业,精确的温湿度监控对于确保安全、质量和效率都至关重要。 客户案例 医疗行业 在医疗行业,温湿度监控对于存储药品、生物样本和医疗设备至关重要。山东某医院引入了泛地缘科技推出的温湿…

顿号在键盘上怎么打?教你4个输入方法!

“朋友们,我正在准备一篇期末论文,但是文章里的顿号我一直输入不了。顿号在键盘上应该怎么输入呀?谁能教教我呢?非常感谢!” 在使用电脑编辑文档时,我们可能经常需要输入顿号。但有些朋友还不知道顿号在键盘…

性能测试-JMeter分布式测试及其详细步骤

性能测试概要 性能测试是软件测试中的一种,它可以衡量系统的稳定性、扩展性、可靠性、速度和资源使用。它可以发现性能瓶颈,确保能满足业务需求。很多系统都需要做性能测试,如Web应用、数据库和操作系统等。 性能测试种类非常多&#xff0c…

Pycharm中终端不显示虚拟环境名解决方法

文章目录 一、问题说明:二、解决方法:三、重启Pycharm 一、问题说明: Pycharm中打开项目配置完需要的虚拟环境后,在Terminal(终端)中无法切换及显示当前需要运行代码的虚拟环境。 比如以下一种情况&#…

数据可视化素材分享 | 数十图表、无数模板

很多人在后台求分享报表、源代码,其实何必这么麻烦,在奥威BI数据可视化平台上点击即可获得大量的可视化素材,如数十种可视化图表,适用于不同分析场景;又如大量不同主题的BI数据可视化报表模板,套用后替换数…

商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

如何在C程序中使用libcurl库下载网页内容

概述 爬虫是一种自动获取网页内容的程序,它可以用于数据采集、信息分析、网站监测等多种场景。在C语言中,有一个非常强大和灵活的库可以用于实现爬虫功能,那就是libcurl。libcurl是一个支持多种协议和平台的网络传输库,它提供了一…

NetCore/Net8下使用Redis的分布式锁实现秒杀功能

目的 本文主要是使用NetCore/Net8加上Redis来实现一个简单的秒杀功能,学习Redis的分布式锁功能。 准备工作 1.Visual Studio 2022开发工具 2.Redis集群(6个Redis实例,3主3从)或者单个Redis实例也可以。 实现思路 1.秒杀开始…

PAM从入门到精通(七)

接前一篇文章:PAM从入门到精通(六) 本文参考: 《The Linux-PAM Application Developers Guide》 先再来重温一下PAM系统架构: 更加形象的形式: 五、主要函数详解 5. pam_strerror 概述: 描述…

防火墙规则顺序解决方案

防火墙是保护网络免受攻击的第一道防线,防火墙对互联网和公司IT网络之间的流量拥有绝对控制权,防火墙规则的配置处理调节流量的关键任务。 这些规则会仔细检查传入和传出流量,并根据规则中提到的条件允许或阻止它,防火墙规则越严…

vscode调试container(进行rocksdb调试)+vscode比较git项目不同分支和fork的哪个分支

vscode调试container(进行rocksdb调试) 参考链接: https://blog.csdn.net/qq_29809823/article/details/128445308#t5 https://blog.csdn.net/qq_29809823/article/details/121978762#t7 使用vscode中的插件dev containners->点击左侧的…

C语言实现句子中的单词颠倒排序

一、运行结果 二、源代码 # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <assert.h>//实现逆转函数&#xff1b; void reverse(char* left, char* right) {//断言left和right都不能为空&#xff1b;assert(left);assert(right);//循环逆转字母…

使用Linux远程连接OpenGauss数据库的步骤和方法

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合…

c 语言基础:L1-044 稳赢

大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现要求你编写一个稳赢不输的程序&#xff0c;根据对方的出招&#xff0c;给出对应的赢招。但是&#xff01;为了不让对方输得太惨&#xff0c;你需要每隔K次就让一个…

电子奖牌-参数

产品参数 产品型号 ESL_6color_8.14_BLE 尺寸(mm) 200*135*7mm 显示技术 电子墨水屏 显示区域(mm) 180.22(H) * 101.38(V) 分辨率(像素) 1024*576 像素尺寸(mm) 0.176*0.176 144pdi 显示颜色 黑/白/红/黄/蓝/绿 外观颜色 实木色 视觉角度 180 工作温度 …

k8s集群授权prometheus(集群外部署)

一、前言 在集群外部prometheus想要调用k8s集群的apiserver获取监控数据需要通过token和ca验证&#xff0c;在集群内部部署的prometheus就不会有这个情况&#xff0c;因为集群内部部署prometheus pod的时候就已经注入了访问集群的token和ca文件&#xff0c;所以以下就针对k8s集…

[正式学习java③]——字符串在内存中的存储方式、为什么字符串不可变、字符串的拼接原理,键盘录入的小细节。

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、字符串 1.字符串在内存中的存储方式 2.创建字符串对象的两种方式 3.两种创建方式的区别 4.字符串对象一旦创建不可改变 - 为什么&#xff1f;&#xff1f;&#xff1f; 5.字符串的拼接 6.字符串的拼接原…

前端自学需要把大量时间放在 HTML、CSS 吗?

前言 html和css其实不需要花费太多的时间&#xff0c;html暂且不说&#xff0c;css各类的属性太多了&#xff0c;平时如果只是简单做一些小网站根本不需要全部掌握&#xff0c;只需要掌握一些基础常用的即可&#xff0c;一般遇到不会的也可以直接查文档&#xff0c;就我个人来…

视觉Slam面试题(不定时更新)

文章目录 0 引言1 单目、双目、深度相机和RGBD相机的区别2 特征点法与直接法的优缺点3 等距变换、相似变换、仿射变换、射影变换的区别4 单应矩阵、本质矩阵和基础矩阵的区别5 Slam中为什么用李群李代数6 解释Slam中的绑架问题7 ORB、SIFT和SURF特征点检测算法的区别8 什么是对…