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

news2024/12/26 22:49:08

❤️博客主页 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则会返回一个OSError
    print(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 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"])
    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.coloradmin.cn/o/1098583.html

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

相关文章

Unity SRP 管线【第一讲:自定义渲染管线】

来源: https://edu.uwa4d.com/lesson-detail/282/1308/0?isPreviewfalse 文章目录 来源:自定义渲染管线前置工作渲染管线资产渲染管线实例 正式渲染CommandBuffer清除渲染目标剔除(Culling)绘制绘制集合体 透明和不透明物体分开…

MySQL学习(二)——MySQL内置函数

文章目录 1. 函数1.1 字符串函数1.2 数值函数1.3 日期函数1.4 流程函数 2. 约束2.1 概述2.2 外键约束2.2.1 外键使用2.2.2 删除/更新行为 1. 函数 和其他编程语言一样,MySQL也有函数的定义。函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#…

jmeter接口测试实战:接口加密、接口解密、签名sign接口实战详解

在接口测试中,签名(sign)是一种重要的加密方式,用于保障数据传输的安全性和完整性。在这篇文章中,我们将通过一个具体的案例来学习如何使用 JMeter 进行签名接口的测试,并用 Python 代码进行实战演示。 比…

集成友盟qq互联分享,导出风险问题处理

处理方案:移除 android:exported"true"即可。 注意友盟SDK QQ share 里默认配置是android:exported"true",所以要覆盖即可。

为什么CDN能创造这么利益

互联网的快速发展带来了更多的在线内容和应用,但同时也引发了对网站性能的高要求。用户对快速加载的期望越来越高,这就需要采用高效的内容分发解决方案。在这方面,CDN(内容分发网络)扮演了关键角色,通过其分…

uniapp(uncloud) 使用生态开发接口详情2(使用 schema创建数据, schema2code创建页面, iconfont 引入项目)

上一篇介绍如何创建项目,接下来该是如何使用 在项目中pages 目录下,新建界面 项目运行,浏览器中用账号密码登录, 新建一级和二级页面 2.1 系统管理 > 菜单管理 (新增一级界面) 2.2 找到刚刚创建的菜单, 操作行有 子菜单(点击) 用DB Schema创建页面, 3.1 在uniCloud > d…

大规模语言模型人类反馈对齐--RLHF

大规模语言模型在进行监督微调后, 模型具备了遵循指令和多轮对话的能力, 具备了初步与用户进行对话 的能力。然而, 大规模语言模由于庞大的参数量和训练语料, 其复杂性往往难以理解和预测。当这些模型被部署 时, 它们可…

经济不景气时,企业如何通过反向竞价节省成本?

在经济不景气时期,企业往往被迫寻找创新方法来削减成本,争取提高盈利。其中一种越来越受欢迎的方法就是使用反向竞价。 反向竞价是一种采购策略,它颠覆了传统的采购流程,允许供应商竞争买方的业务。这种方法可以节省大量成本&…

退税政策线上VR互动科普展厅为税收工作带来了强大活力

缴税纳税是每个公民应尽的义务和责任,由于很多人缺乏专业的缴税纳税操作专业知识和经验,因此为了提高大家的缴税纳税办事效率和好感度,越来越多地区税务局开始引进VR虚拟现实、web3d开发和多媒体等技术手段,基于线上为广大公民提供…

C# Winform编程(2)常用控件

C# Winform编程(2)常用控件 常用控件 常用控件 标签,文本,按钮,列表框,组合框等的使用 Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks…

Python-pyecharts和pandas库

目录 pyecharts库 pandas库 示例1 示例2 pyecharts库 pyecharts是一个基于Python的交互式数据可视化库,旨在帮助用户轻松地创建各种类型的图表和可视化效果。该库是在Echarts开源项目的基础上开发的,Echarts是一款由百度开发的优秀的数据可视化工具。…

静力触探数据智能预处理(3)

静力触探数据智能预处理(3) 前言 将钻探、物探、静力触探三种数据放在一起对比分析,三种方法间存在尚不明确的物性联系。利用某规范进行土的分类,得出了全是砂土的错误结论,非专业编写,仅供参考。 1、对…

Xilinx IP 10G Ethernet PCS/PMA IP Core

Vivado 10G Ethernet PCS/PMA介绍 1介绍 完整的10G以太网接口如下图,分为10G PHY和10G MAC两部分。 这篇文章重点讲 10G Ethernet PCS/PMA。 2 IP的基本介绍 10G以太网物理编码子层/物理介质连接(PCS/PMA)核心在Xilinx 10G以太网介质访问控制器(MAC)核心和具有10Gb/s…

并发数的计算

一 常用平均并发数计算公式 1.1 普通计算方法 计算公式: TPS总请求数/总时间按照需求所示,第32周有4.13万的浏览量,那么总请求数估算为4.13万 总请求数4.13完请求数41300请求数 总时间1天24小时24*3600秒 TPS41300请求数/24*3600秒0.48请求数…

2.1 初探大数据

文章目录 零、学习目标一、导入新课二、新课讲解(一)什么是大数据(二)大数据的特征1、Volume - 数据量大2、Variety - 数据多样3、Velocity - 数据增速快4、Value - 数据价值低5、Veracity - 数据真实性 (三&#xff0…

Cpolar和极简主义文件管理器:为用户提供高效稳定的个人云存储服务

文章目录 1. 前言2.Tiny File Manager网站搭建2.1.Tiny file manager下载和安装2.2 Tiny file manager网页测试2.2 Tiny file manager网页测试3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试总结 1. 前言 文件共享和查阅是现在网络最常见的应用场景&am…

基于ssm的图书商城

功能如下图所示 摘要 今天,我们生活在一个充满活力的时代,其中网购已经成为一种主要购物方式。传统实体书店的客流量日益减少,而实体书籍的销售量也逐年下滑,这不可避免地导致了在线图书商城的崛起。在线商城具有众多优势。首先&a…

谷歌、AMD、英特尔加入挑战,英伟达AI解决方案还能继续“遥遥领先”吗?

夕小瑶科技说 原创 编译 | 谢年年 要问世界范围内人工智能解决方案谁最“遥遥领先”? 那肯定是英伟达! 然鹅这一情况很有可能会发生变动。 谷歌正在构建自己的人工智能基础设施! 除了谷歌,在软件方面,Meta的PyTor…

华为云云耀云服务器L实例评测|CentOS系统盘迁移到数据盘教程讲解

华为云云耀云服务器L实例评测|CentOS系统盘迁移到数据盘教程讲解 在华为云网购买华为云云耀云服务器L实例的Centos系统机器,可能会出现没有在挂载数据盘直接安装在系统盘情况,又或者系统初始化自动挂载在其他目录上。建议大家都把数据存放在数据盘下 …

CICD:Circle CI 实现CICD

持续集成解决什么问题 提高软件质量效率迭代便捷部署快速交付、便于管理 持续集成(CI) 集成,就是一些孤立的事物或元素通过某种方式集中在一起,产生联系,从而构建一个有机整体的过程。 持续,就是指长期…