关于企业的网站,网站建设素材网页,专注湛江地区网站开发定制建设,手机网站横竖屏❤️博客主页#xff1a; iknow181#x1f525;系列专栏#xff1a; Python、JavaSE、JavaWeb、CCNP#x1f389;欢迎大家点赞#x1f44d;收藏⭐评论✍ 目录
一、前言
二、准备工作
三、Telnetlib
Telnetlib介绍
Telnetlib模块及操作方法介绍
Telnetlib配置设备
T…❤️博客主页 iknow181系列专栏 Python、JavaSE、JavaWeb、CCNP欢迎大家点赞收藏⭐评论✍ 目录
一、前言
二、准备工作
三、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中导入Telnetlib和Netmiko库
Telnetlib直接导入就可以
import telnetlib
Netmiko则需要先下载软件包打开文件file中的设置setting找到项目Project下的Python解释器点击加号
在输入框中输入Netmiko点击第一个选项netmiko安装软件包即可。
注意下载时必须保证一个好的网速不然会非常慢且容易断开下载从而下载失败。 自此我们的准备工作就全部完成了下面开始上代码 三、Telnetlib
Telnetlib介绍 Telnetlib模块是Python提供的可用于Telnet连接使用的模块值得注意的是在现有的生产环境中Telnet协议连接已经使用的较为少见了原因也非常简单Telnet协议是明文传输的协议所以在数据传输尤其是在公网上传输的时候极其不安全。
且telnetlib已逐渐弃用并计划在Python 3.13 版本中删除 Telnetlib模块及操作方法介绍
1. Telnet(hostNone, port0, timeoutNone)Telnet类的构造函数用于创建一个Telnet对象。参数host是远程主机的地址port是远程主机的端口号timeout是连接超时时间。
2. open(host, port23, timeoutNone)打开一个Telnet连接。参数host和port与Telnet构造函数中的相同。
3. read_until(expected, timeoutNone)读取输入直到遇到预期的字符串。参数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, timeoutNone)等待预期的字符串出现返回匹配的字符串。参数list是一个字符串列表每个字符串表示一个预期的字符串timeout是等待超时时间。
10. expect_regexp(list, timeoutNone)等待预期的正则表达式出现返回匹配的字符串。参数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(bUsername:) # b表示等待期望的字符出现
tn.write(username.encode(ascii) b\n) # 通过tn.write()的方式输入用户名b/n表示回车
tn.read_until(bPassword:) # b表示等待期望的字符出现
tn.write(password.encode(ascii) b\n) # 通过tn.write()的方式输入密码b/n表示回车
# 通过write函数输入配置命令
tn.write(benable\n)
tn.write(bconfigure terminal\n)
tn.write(busername CCIE password CCIE\n)
tn.write(bend\n)
tn.write(bwr\n)
tn.write(bexit\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, port23, timeout10)
# 输入用户名tn.read_until(bUsername:)tn.write(username.encode(ascii) b\n)
# 输入密码tn.read_until(bPassword:)tn.write(password.encode(ascii) b\n)
# 登录完成后执行命令tn.write(benable\n)tn.write(bconfigure terminal\n)tn.write(busername CCIECLUB privilege 15 password CCIECLUB\n)tn.write(bend\n)tn.write(bexit\n)tn.write(bwr\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, port23, timeout10)tn.set_debuglevel(1)
# 输入用户名tn.read_until(bUsername:)tn.write(username.encode(ascii) b\n)
# 输入密码tn.read_until(bPassword:)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文档告别手动一个一个的showdisplay。
import telnetlib
import time
def run_telnet(host, username, password):# 通过Telnet登录网络设备tn telnetlib.Telnet(host, port23, timeout10)
# 输入用户名tn.read_until(bUsername:)tn.write(username.encode(ascii) b\n)
# 输入密码tn.read_until(bPassword:)tn.write(password.encode(ascii) b\n)
# 登录完成后执行命令tn.write(benable\n)tn.write(bterminal length 0\n) # 取消分段显示time.sleep(1)tn.write(bshow running-config\n)time.sleep(5)
out tn.read_very_eager().decode(ascii)print(out)
file open(fileE:\\1.txt, modea)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/netmikoNetmiko登陆设备并配置
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, # 远端主机IPusername: 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(fileR1_config.txt, modea) # 以写的方式打开文件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.19from netmiko import ConnectHandler
f open(Lab.txt, moder)
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(filebackup.txt, modea)backup_file_name.write(running_config)