Python批量备份华为设备配置到FTP服务器
Excel表格存放交换机信息:
备份文件夹效果图:
Windows系统配置计划任务定时执行python脚本:
Program/script:C:\Python\python.exe
Add arguments (optional): D:\Python_PycharmProjects\JunLan_pythonProject1\Python_CodeFile\netmiko\Batch_backup_Huawei_switch_configuration_to_FTP.py
完整Python代码:
'''
该代码用于批量备份网络设备配置。通过读取Excel表格中的设备IP地址和登录凭据,使用netmiko库连接设备并备份配置。
具体实现方法包括:读取Excel表格中的设备IP地址和登录凭据;使用netmiko库连接设备;使用send_command_timing()方法下发交换机命令获,将获取的配置上传到FTP服务器。
注意事项:1、FTP服务器的IP地址、用户名和密码需要提前配置好;2、ftp命令中的文件名不能包含空格或其他特殊字符。3、ftp命令中的文件名不能超出64个文字。
'''from netmiko import ConnectHandler, NetmikoTimeoutException, NetmikoAuthenticationException
from openpyxl import load_workbook
from rich.progress import track
from datetime import datetime
import socket, osdef read_excel_data(): # 设定一个函数来读取Excel数据file_path = r'D:\Network_Backup\IT_assets.xlsx' # 在函数内部定义Excel文件路径workbook = load_workbook(filename=file_path) # 加载Excel文件sheet = workbook["Huawei"] # 指定名为"Huawei"的工作表# 获取各列数据ips = [cell.value for cell in sheet['C'][1:]] # 获取IP地址列数据,从第二行开始names = [cell.value for cell in sheet['D'][1:]] # 获取设备名称列数据username_col = [cell.value for cell in sheet['E'][1:]] # 获取用户名列数据password_col = [cell.value for cell in sheet['F'][1:]] # 获取密码列数据return ips, names, username_col, password_col # 返回获取到的数据def ssh_connection():ips, names, username_col, password_col = read_excel_data() # 调用(执行)函数读取Excel数据,赋予变量,这里使用相同的变量名num_switches = min(len(ips), len(names), len(username_col), len(password_col)) # 获取交换机数量,确定循环次数,以较短的数据范围为准ftp_host = '10.1.74.23' # FTP 服务器的 IP 地址ftp_username = 'ftpbackup' # FTP 服务器的用户名ftp_password = 'qbk>c]0a' # FTP 服务器的密码success_count = 0 # 初始化成功计数器failure_count = 0 # 初始化失败计数器backup_dir = os.path.join(r'D:\Network_Backup', f"{datetime.now().strftime('%Y%m%d')}") # 创建备份目录,以当前日期命名log_file_path = os.path.join(backup_dir, "Huawei_backup_summary.log") # 创建日志文件,保存连接错误信息output_data_file = os.path.join(backup_dir, "Huawei_output_data.txt") # 创建输出数据文件,即回显内容保存的文件if not os.path.exists(backup_dir): # 判断是否存在该文件夹os.makedirs(backup_dir) # 不存在则创建文件夹new_folder_name = os.path.basename(backup_dir) # 获取新创建的文件夹名称# print(f"New folder created: {new_folder_name}")with open(log_file_path, 'a') as log_file: # 使用 'a' 模式以追加方式打开日志文件with open(output_data_file, 'a') as data_file: # 使用 'a' 模式以追加方式打开数据文件,即用来保存回显内容for i in track(range(num_switches), description="Running..."): # 遍历交换机,使用 track 函数显示进度条try:ip = ips[i] # 获取 IP 地址name = names[i] # 获取交换机名称username = username_col[i] # 获取当前索引i对应的用户名信息password = password_col[i] # 获取当前索引i对应的密码信息now = datetime.now() # 获取当前日期和时间now_time = now.strftime("%Y%m%d_%H%M%S") # 格式化为年月日_时分秒new_name_huawei = f"{name.replace(' ', '')}_{ip}_{now_time}_vrpcfg.zip" # 使用交换机名称、IP地址和当前时间生成新的文件名,其中name.replace将有空格的字符串替换为空字符串。put = 'put vrpcfg.zip ' + new_name_huaweidevice = { 'device_type': 'huawei_ssh', # 指定连接的类型'ip': ip, # 从excel文件中获取IP地址'username': username, # 从excel文件中获取用户名'password': password, # 从excel文件中获取用户名'conn_timeout': 20, # 连接超时时间默认为10秒,大多数情况下 15 秒足以应对网络传输中的大多数问题。}with ConnectHandler(**device) as net_connect: # 连接交换机output = net_connect.send_command_timing('save ') # 保存配置output += net_connect.send_command_timing('y') # 确认保存配置output += net_connect.send_command_timing(f'ftp {ftp_host}') # 在交换机上执行连接 FTP 命令output += net_connect.send_command_timing(ftp_username) # 输入FTP服务器用户名output += net_connect.send_command_timing(ftp_password) # 输入FTP服务器密码output += net_connect.send_command_timing(f'cd {new_folder_name}') # 切换到新创建的文件夹output += net_connect.send_command_timing(put) # 执行 put 命令保存配置文件到 FTP 服务器,命令格式:put 本地(交换机)文件名 远程文件名output_data = f"Device {ip} ({name}):\n{output}\n" # 将执行输出的内容转换为字符串,赋予给变量# print(output_data)if "226 Successfully transferred" in output_data: # 判断配置文件是否成功传输到FTP服务器success_count += 1 # 统计成功计数器加1print(f"File transfer successful for device {ip} {name}")else:failure_count += 1print(f"File transfer failed for device {ip} {name}")log_file.write("File transfer failed for device {ip} {name}")data_file.write(put + "\n\n" + output_data + "\n" + "-" * 200 + "\n") # 将执行输出的内容写入到文件中except Exception as e: # 捕获 NetmikoTimeoutException 异常,该异常通常在尝试连接设备超时时抛出error_message = f"An error occurred while processing Device {ip} ({name}): {str(e)}\n"# print(error_message, end="") # 不希望打印错误可注释log_file.write(error_message + "\n" + "-" * 200 + "\n") # 将错误信息追加写入到日志文件中failure_count += 1 # 当捕获到异常时,增加失败计数except NetmikoTimeoutException as timeout_e: # 当与网络设备建立SSH连接时,如果超过预设的超时时间仍未成功,则会捕获此异常并打印相关错误信息。error_message = f"Timeout occurred while connecting to Device {ip} ({name}): {str(timeout_e)}"log_file.write(error_message + "\n" + "-" * 200 + "\n") # 将错误信息追加写入到日志文件中failure_count += 1 # 当捕获到异常时,增加失败计数except NetmikoAuthenticationException as auth_e: # 当提供的用户名或密码无法通过网络设备的验证时,将捕获此异常并输出认证失败的具体信息。error_message = f"Authentication failed for Device {ip} ({name}): {str(auth_e)}"log_file.write(error_message + "\n" + "-" * 200 + "\n") # 将错误信息追加写入到日志文件中failure_count += 1 # 当捕获到异常时,增加失败计数except socket.timeout as sock_timeout: # 这是在底层网络通信过程中遇到超时时抛出的异常,在进行网络连接时(例如:TCP连接阶段),如果等待响应的时间超过了设置的超时值,那么就会触发此异常,并打印相应的超时信息。error_message = "Socket timeout occurred while connecting to Device {ip} ({name})."log_file.write(error_message + "\n" + "-" * 200 + "\n") # 将错误信息追加写入到日志文件中failure_count += 1 # 当捕获到异常时,增加失败计数except KeyboardInterrupt: # 捕获用户手动中断(如按 Ctrl+C)print("\nProgram interrupted by user.")breaksummary_message = "\nSummary:\nSuccessfully processed {} devices.\n{} devices failed to be processed.\n".format(success_count, failure_count)log_file.write(summary_message + "\n" + "-" * 200 + "\n") # 将成功和失败的数量写入到日志文件中# print(summary_message) # 打印成功和失败的数量if __name__ == "__main__":ssh_connection() # 调用(执行)函数进行 SSH 连接和配置文件下载# print(num_switches)
相关文章:

Python批量备份华为设备配置到FTP服务器
Excel表格存放交换机信息: 备份文件夹效果图: Windows系统配置计划任务定时执行python脚本: Program/script:C:\Python\python.exe Add arguments (optional): D:\Python_PycharmProjects\JunLan_pythonProje…...

Java虚拟机(JVM)中确保资源及时释放的策略
在Java虚拟机(JVM)中,内存管理主要是通过垃圾回收(Garbage Collection, GC)来自动处理的。Java开发者通常不需要(也不应该)显式地释放对象内存,因为JVM的垃圾回收器会自动处理不再使…...

04-Fortran基础--Fortran数组和矩阵运算
04-Fortran基础--Fortran数组和矩阵运算 fortarn中对数组和矩阵的主要操作和内置运算包括: 数组的声明和初始化:fortarn中可以通过声明和初始化来创建数组。例如: integer :: my_array(3) [1, 2, 3] ! 声明一个包含3个整数的数组并初始化数…...

el-select选项框内容过长
利用popper-class实现选项框内容过长,截取显示功能: <el-select popper-class"popper-class" :popper-append-to-body"false" v-model"value" placeholder"请选择"><el-optionv-for"item in opt…...

K8S面试题学习5
参考K8S面试题(史上最全 持续更新)_kubernetes常见面试题-CSDN博客做的个人总结,规划是每天看10题,thx! 1. 请详述kube-proxy原理? 每个node节点都会运行一个kube-proxy的进程,核心功能是将service的访问…...

字符以及字符串函数
字符以及字符串函数 求字符串长度strlen 长度不受限制的字符串函数strcpystrcatstrcmp 长度受限制的字符串函数strncpystrncatstrncmp 字符串查找strstrstrtok 错误信息报告strerror 字符分类函数字符转换函数tolowertoupper 内存操作函数memcpymemmovememcmpmemset 这篇文章注…...

记录解决问题--redis ssl连接
1.问题场景 springboot连接redis启动报错,感觉是没连上redis,本地是正常启动的,但是本地不是ssl连接。 2.redis ssl连接知识 ①一般不开启ssl的连接,直接连接即可,有密码输密码。 ②不受信的ssl连接,也就…...

买卖股票的最佳时机
dp[i][0] 表示第i天持有股票所得最多现金,相当于买的价格最低,卖的价格最高 持有股票状态为0,不持有为1 用二维数组表示天数和是否持有, i-1天就持有,或者第i天买入 class Solution {public int maxProfit(int[] p…...

Linux部署安装
Linux部署安装 Linux中有两种软件安装包 一、源码包 软件的源代码是软件的原始数据,但是源代码不能直接在计算机中直接运行安装。 需要通过编译将源代码转换为计算机可以识别的机器语言,之后才可以进行安装。 源码包安装的方式可以在安装过程中发根据…...

docker搭建mysql集群实现主从复制
前言 随着业务的增长,一台数据服务器已经满足不了需求了,负载过重。这个时候就需要减压了,实现负载均衡和读写分离,一主一丛或一主多从。 主服务器只负责写,而从服务器只负责读,从而提高了效率减轻压力。 …...

Neo4j 之安装和 CQL 基本命令学习
正常使用结构化的查询语言 SQL(Structured Query Language)较多一些,但是像 Neo4j 这种非结构化的图形数据库来说,就不得不学习下 CQL(Cypher Query Language)语言了。如果你之前学过 《离散数学》或《图论…...

【全开源】JAVA台球助教台球教练多端系统源码支持微信小程序+微信公众号+H5+APP
功能介绍 球厅端:球厅认证、教练人数、教练的位置记录、助教申请、我的项目、签到记录、我的钱包、数据统计 教练端:我的页面,数据统计、订单详情、保证金、实名认证、服务管理、紧急求助、签到功能 用户端:精准分类、我的助教…...

机器学习-如何为模型选择评估指标?
为机器学习模型选择评估指标是一个关键步骤,因为它直接关联到如何衡量模型的性能。以下是选择评估指标的一些建议: 1、理解问题类型: 分类问题:对于二分类问题,常见的评估指标包括准确率、精确率、召回率、F1分数、R…...

【AutoGPT】踩坑帖(follow李鱼皮)
本文写于2024年5月7日 参考视频:AutoGPT傻瓜式使用教程真实体验! 对应文章:炸裂的AutoGPT,帮我做了个网站! 平台:GitPod 云托管服务 原仓库已经改动很大,应使用的Repo为:Auto-GPT-ZH…...

机器学习-L1正则/L2正则
机器学习-L1正则/L2正则 目录 1.L1正则 2.L2正则 3.结合 1.L1正则 L1正则是一种用来约束模型参数的技术,常用于机器学习和统计建模中,特别是在处理特征选择问题时非常有用。 想象一下,你在装备行囊准备去旅行,但你的行囊有一…...

Linux——socket编程之tcp通信
前言 前面我们学习socket的udp通信,了解到了socket的概念与udp的实现方法,今天我们来学习一下面向连接的tcp通信。 一、tcp套接字创建 UDP和TCP都是通过套接字(socket)来实现通信的,因此TCP也得使用socket()接口创建…...

HTTP协议介绍
文章目录 http协议http协议格式GET请求POST请求http客户端实现 http协议 http协议是应用层协议,一般建立在tcp协议的基础之上(当然你的实现非要基于udp也是可以的),也就是说http协议的数据收发是通过tcp协议的。 http协议也分为h…...

elasticsearch安装配置注意事项
安装Elasticsearch时,需要注意以下几个重要事项: 1、版本选择:选择与你系统和其他组件(如Logstash、Kibana)兼容的Elasticsearch版本。 2、Java环境:Elasticsearch是基于Java构建的,因此确保已…...

Istio 流量管理(请求路由、流量转移、请求重试、流量镜像、故障注入、熔断等)介绍及使用
一、Istio 流量管理 Istio是一个开源的服务网格,它为分布式微服务架构提供了网络层的抽象。它使得服务之间的通信变得更为可靠、安全,并且提供了细粒度的流量管理、监控和策略实施功能。Istio通过在服务之间插入一个透明的代理(Envoy&#x…...

Transformers中加载预训练模型的过程剖析
使用HuggingFace的Transformers库加载预训练模型来处理下游深度学习任务很是方便,然而加载预训练模型的方法多种多样且过程比较隐蔽,这在一定程度上会给人带来困惑。因此,本篇文章主要讲一下使用不同方法加载本地预训练模型的区别、加载预训练模型及其配置的过程,藉此做个记…...

使用MCU的 GPIO口 模拟SDIO时序读写TF/SD卡的可能性。
SD2.0协议详解:命令格式、初始化/读取/写入 - WangXuan的文章 - 知乎 https://zhuanlan.zhihu.com/p/610495260 参考上述与其它理解,若使用GPIO口模拟,重点与难点: 1. 时钟线问题: 在SD准备期间,需不间断…...

SSM【Spring SpringMVC Mybatis】——Mybatis(二)
如果对一些基础理论感兴趣可以看这一期👇 SSM【Spring SpringMVC Mybatis】——Mybatis 目录 1、Mybatis中参数传递问题 1.1 单个普通参数 1.2 多个普通参数 1.3 命名参数 1.4 POJO参数 1.5 Map参数 1.6 Collection|List|Array等参数 2、Mybatis参数传递【#与…...

在线教育系统在线网校报价,培训机构是怎样招聘老师的?流程是什么?
招生是培训机构的一大难题,但招不来老师,招不到好老师却也是培训机构面临的一个更为严峻的问题,没有老师,教学工作就展不开,没有老师,学生就留不住。培训学校的人员招聘不要等缺失时才去招聘,要…...

您的文件和驱动器上的“密码保护”有多安全?
某些行业(例如医疗保健、法律和公司)的人们在通过电子邮件发送文件时通常依赖密码保护,认为它可以提供足够的安全性来防止窥探。然而,对 PDF 或 Excel 文件进行简单的密码保护并不像看起来那样万无一失。 使用密码保护文件而不加…...

4000字超详解Linux权限
各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 在Linux当中权限的体现主要有两种 普通用户 超…...

SearXNG - 一个注重隐私的互联网元搜索引擎
引言 在数字监控和数据货币化的时代,对于许多用户而言,在线保护个人信息变得至关重要。隐私问题特别突出的一个领域是搜索引擎,它们经常收集用户数据以定制个性化广告或构建用户档案。SearXNG 是一个开源的元搜索引擎,它汇集了各…...

(第15天)【leetcode题解】459、重复的子字符串
目录 459、重复的子字符串题目描述暴力匹配思路代码 字符串匹配思路代码与暴力匹配的不同 KMP解法思路代码KMP算法的核心和用途 459、重复的子字符串 题目描述 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 暴力匹配 思路 推理 如果…...

PostgreSQL的学习心得和知识总结(一百四十二)|深入理解PostgreSQL数据库数据库之 Continuous Integration
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…...

【外币兑换,简单贪心】
小明刚从美国回来,发现手上还有一些未用完的美金,于是想去银行兑换成人民币。可是听说最近人民币将会升值,并从金融机构得到了接下来十二个月可能的美元对人民币汇率,现在,小明想要在接下来一年中把美金都兑换成人民币…...

数据库入门(sql文档+命令行)
一.基础知识 1.SQL(Structured Query Language)结构化查询语言分类: DDL数据定义语言用来定义数据库对象:数据库、表、字段DML数据操作语言对数据库进行增删改查DQL数据查询语言查询数据库中表的信息DCL数据控制语言用来创建数据…...