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)

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

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

相关文章

AWS Cli Windows安装配置

1. 安装 下载地址:AWS 命令行界面(CLI)_管理AWS服务的统一工具-AWS云服务 检验安装: > aws --version aws-cli/2.15.44 Python/3.11.8 Windows/10 exe/AMD64 prompt/off 2. 创建IAM用户 1) 创建组 选择IAM 点击创建组 填写用户组名,…

c++——类和对象(中)

1.类的六个默认成员函数 在一个空类中真的什么都没有吗,错!在创建类的时候,编译器自动生成六个函数,这六个函数叫默认成员函数。但是,如果我们自己实现六个同名函数(依旧有默认成员函数的特性,…

Django项目之电商购物商城 -- 创建收货地址

Django项目之电商购物商城 – 创建收货地址 一. 在users中创建新的视图与路由用于创建收货地址 # 设置收货地址 class AddressView(View):def get(self , request):return render(request , "user_center_site.html")# 设置收货地址path(user_center_site/, views.…

金和OAC6 FileDownLoad 任意文件读取漏洞

文章目录 免责声明漏洞描述漏洞原理影响版本漏洞复现修复建议 免责声明 没有网络安全就没有国家安全,该文章只为学习和交流,利用做违法乱纪的事,与本人无关 漏洞描述 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,…

AI视频教程下载:零代码创建AI智能体、AI Agents和ChatGPT的Gpts

这门课程专注于提示工程的掌握,教你以精确的方式引导GPT,利用它们的生成能力产生卓越的AI驱动结果。一步一步地,你将学会创建多样化的GPT军团——每个都设计来满足特定的专业需求。 从提供个性化职业变更指导的职业教练AI,到以惊…

IDEA切换分支

方法一 1、选择要切换分支的module 2、右键,选择git 3、再点击branches 4、可以看到当前module的本地分支(local Branches)及远程分支(Remote Branches)列表。点击你要切换到的分支,Checkout即可。 方法二 1、点击…

MATLAB模拟退火算法、遗传算法、蚁群算法、粒子群算法

概况 模拟退火算法、遗传算法、蚁群算法、粒子群算法等算法,都是属于概率算法,不绝对,不迅速,能用其它方式解决的问题,不要用这些相对复杂的算法,比如有明确的线性关系或者非线性对应关系。这里的概率算法…

大模型背后的秘密公式: Q*?

这麽说好像我是James Bond后面那个厉害的Q先生,Q是英文Quartermaster(軍需官)第1個英文字大寫,是007系列英國祕勤局虛構部門Q部門的領導。 Stanford大学的研究者最近发表了一篇名为"From r to Q*: Your Language Model is S…

回答篇:测试开发高频面试题目

引用之前文章:《测试开发高频面试题目》 https://blog.csdn.net/qq_41214208/article/details/138193469?spm1001.2014.3001.5502 本篇文章是回答篇(持续更新中) 1. 什么是测试开发以及其在软件开发流程中的作用。 a. 测试开发是指测试人员或…

ABC352编程笔记

ABC352 编程笔记 题意&#xff1a;输入&#xff0c;四个数 a , b , c , d a,b,c,d a,b,c,d&#xff0c;若 d d d 在 c , d c,d c,d 之间&#xff0c;则输出 Yes&#xff0c;否则输出 No。 正解&#xff1a;直接判断。 #include <bits/stdc.h> //#define int long lo…

基于 stable diffusion 制作上世纪90年代的游戏美术风格

1. 项目背景 目前游戏项目中出现美术产能不足的瓶颈&#xff0c;如果使用 midjourney 之类的第三方生成式人工智能产品生成美术素材的话&#xff0c;一方面需要将我们的美术资产投喂给第三方企业进行风格训练&#xff0c;有安全性上的风险&#xff0c;另一方面&#xff0c;第三…

华为ensp中BFD和OSPF联动(原理及配置命令)

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月6日20点26分 BFD通常指的是双向转发检测。BFD是一个旨在快速检测通信链路故障的网络协议&#xff0c;提供了低开销、短延迟的链路故障检测机制。它主要用于监测两个…

VisualGDB:Linux静态库项目创建、编译及库的使用

接上篇《VisualGDB&#xff1a;Linux动态库项目创建、编译及库的使用》&#xff0c;静态库的创建和使用与动态库基本无差别&#xff0c;唯一需要做的就是指定项目生成静态库。 一、指定项目生成静态库 二、重新构建和编译项目 这里注意&#xff0c;同样要copy一个libxxx.so格式…

【Spring】GoF 之代理模式

一、代理模式 在 Java 程序中的代理模式的作用&#xff1a; 当一个对象需要受到保护的时候&#xff0c;可以考虑使用代理对象去完成某个行为 需要给某个对象的功能进行功能增强的时候&#xff0c;可以考虑找一个代理进行增强 A 对象无法和 B 对象直接交互时&#xff0c;也可以…

IDEA终端环境配置

Idea如何配置终端&#xff1b; 第一步&#xff1a;找到我的电脑&#xff0c;右击——属性——高级系统设置——环境变量 先配置path: 在后面加入&#xff1a;C:\Program Files (x86)\Java\jdk1.7.0_75\bin&#xff08;每个人放置jdk的位置不同。&#xff09; 新建classpath:…

华为OD机试【贪吃的猴子】(java)(200分)

1、题目描述 只贪吃的猴子&#xff0c;来到一个果园&#xff0c;发现许多串香蕉排成一行&#xff0c;每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。 猴子获取香蕉&#xff0c;每次都只能从行的开头或者末尾获取&#xff0c;并且只能获取N次&#xff0c;求猴子最…

机器人系统ros2-开发实践08-了解如何使用 tf2 来访问坐标帧转换(Python)

tf2 库允许你在 ROS 节点中查询两个帧之间的转换。这个查询可以是阻塞的&#xff0c;也可以是非阻塞的&#xff0c;取决于你的需求。下面是一个基本的 Python 示例&#xff0c;展示如何在 ROS 节点中使用 tf2 查询帧转换。 本教程假设您已完成tf2 静态广播器教程 (Python)和tf…

如何高效解决渠道问题

品牌渠道会围绕销售做一系列活动&#xff0c;定价也会影响渠道的发展&#xff0c;同样的维护好价格&#xff0c;对渠道来说同样重要&#xff0c;渠道中常见的问题包含低价、窜货等&#xff0c;当低价问题不及时解决&#xff0c;会波及影响更多链接&#xff0c;使其他店铺为了流…

力扣刷题第1天:消失的数字

大家好啊&#xff0c;从今天开始将会和大家一起刷题&#xff0c;从今天开始小生也会开辟新的专栏。&#x1f61c;&#x1f61c;&#x1f61c; 目录 第一部分&#xff1a;题目描述 第二部分&#xff1a;题目分析 第三部分&#xff1a;解决方法 3.1 思路一&#xff1a;先排序…

企业短信平台群发_专业群发短信平台

企业平台群发是一种方便、高效的营销方式&#xff0c;通过专业群发平台&#xff0c;企业能够快速、准确地向大量目标客户发送&#xff0c;提高品牌知名度、促进销售和客户互动。下面将详细介绍企业短信平台群发的优势及使用方法。 优势 提高信息覆盖率 企业平台群发可以让企业…