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库加载预训练模型来处理下游深度学习任务很是方便,然而加载预训练模型的方法多种多样且过程比较隐蔽,这在一定程度上会给人带来困惑。因此,本篇文章主要讲一下使用不同方法加载本地预训练模型的区别、加载预训练模型及其配置的过程,藉此做个记…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
