Python批量备份华为设备配置到FTP服务器

news2024/11/16 7:30:29

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, os

def 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_huawei

                    device = { '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  # 统计成功计数器加1
                            print(f"File transfer successful for device {ip} {name}")
                        else:
                            failure_count += 1
                            print(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.")
                    break

            summary_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.coloradmin.cn/o/1658624.html

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

相关文章

[C/C++] -- DFS搜索迷宫路径

设计一个程序,能够对给定的迷宫进行路径搜索,并输出一条从起点到终点的路径。具体来说,程序需要实现以下功能: 接受用户输入的迷宫地图,包括迷宫的行数和列数,以及每个格子的状态(0 表示可通行…

十四五”智慧城市:视频大数据汇聚系统2.0建设方案与特点分析

一、背景需求分析 随着科技的不断发展,智慧城市的建设已经成为城市发展的重要方向。视频汇聚系统作为智慧城市建设的重要组成部分,已经得到了广泛的应用和推广。视频汇聚系统是智慧城市中非常重要的组成部分,它利用摄像头和传感器技术来收集…

Python | Leetcode Python题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution:def removeDuplicates(self, nums: List[int]) -> int:idx, left, right 0, 0, 0while left < len(nums):nums[idx] nums[left]idx 1while right < len(nums) and nums[right] nums[left]:right 1if right - …

【深度学习】时空图卷积网络(STGCN),预测交通流量

论文地址&#xff1a;https://arxiv.org/abs/1709.04875 Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 文章目录 一、摘要二、数据集介绍美国洛杉矶交通数据集 METR-LA 介绍美国加利福尼亚交通数据集 PEMS-BAY 介绍美国…

ASP.NET校园新闻发布系统的设计与实现

摘 要 校园新闻发布系统是在学校区域内为学校教育提供资源共享、信息交流和协同工作的计算机网络信息系统。随着网络技术的发展和Internet应用的普及&#xff0c;互联网已成为人们获取信息的重要来源。由于现在各大学校的教师和学生对信息的需求越来越高&#xff0c;校园信息…

SQL优化详解

目录 插入数据 insert的优化&#xff08;少量数据&#xff09; 批量插入 手动事务提交 主键顺序插入 插入大量数据 主键优化 数据组织方式&#xff1a; 页分裂&#xff1a; 主键顺序插入的方式&#xff1a; 主键乱序插入&#xff1a; 页合并&#xff1a; 主键设计…

软件技术主要学什么课程

软件技术专业主要学习的课程和内容有编程语言、数据结构与算法、数据库技术等&#xff0c;以下是上大学网( www.sdaxue.com)整理的软件技术主要学什么课程&#xff0c;供大家参考&#xff01; 编程语言&#xff1a;掌握一种或多种编程语言&#xff0c;如C#、Java、Python、C等&…

EdgeOne 免费证书快速实现网站 HTTPS 访问

在当今互联网环境下&#xff0c;HTTPS访问已经成为现代网站的必备功能。HTTPS 访问不仅能够更有效地保障用户在访问到网站时的数据安全传输&#xff0c;防止信息泄露、消息劫持等问题&#xff0c;在搜索引擎中&#xff0c;未实现 HTTPS 还会被浏览器提示为不安全网站&#xff0…

Windows平台PyCharm之PySide6开发环境搭建与配置

PySide6 是一个用于创建跨平台 GUI 应用程序的库&#xff0c;它是 Qt for Python 的官方库。Qt 是一个跨平台的 C 应用程序框架&#xff0c;用于开发具有图形用户界面&#xff08;GUI&#xff09;的应用程序。PySide6 允许开发者使用 Python 语言访问 Qt 的功能&#xff0c;从而…

ICode国际青少年编程竞赛- Python-2级训练场-综合练习2

ICode国际青少年编程竞赛- Python-2级训练场-综合练习2 1、 Flyer[0].step() Flyer[1].step() Dev.step(4)2、 for i in range(2):Flyer[i].step()Dev.step(2)Dev.turnLeft() Flyer[0].step(2) Dev.step(2)3、 for i in range(2):Flyer[i * 2 1].step()Dev.step(-i - 2)Dev.tu…

OpenAI 发布 AI 生成图片检测器;Meta 推出 AI 广告创意工具;Google 正式发布 Pixel 8a,主打 AI

OpenAI 发布 AI 生成图片检测器 OpenAI 昨日官宣推出专用的 AI 监测工具&#xff0c;用于监测图片是否由其旗下 AI 图片生成工具 DALL-E 生成&#xff0c;准确率高达 98.8%。 不过该公司表示&#xff0c;这个检测工具并非旨在检测 Midjourney 和 Stability 等其他流行生成器生…

QAnything 在mac M2 上纯python环境安装使用体验(避坑指南)

这是一篇mac m2本地纯python环境安装 qanything的文章。安装并不顺利&#xff0c;官方提供的模型无法在本地跑。 这篇文章记录了&#xff0c;使用xinference来部署本地模型&#xff0c;并利用openAi的通用接口的方式&#xff0c;可以正常使用。 记录了遇到的所有的问题&#xf…

使用Docker安装Nginx

一、Nginx介绍 Nginx 是一款高性能的开源 Web 服务器和反向代理服务器&#xff0c;具有高效能、高稳定性、低资源消耗等优点。可以处理大量并发请求&#xff0c;支持多种协议&#xff0c;还能实现负载均衡、缓存等功能&#xff0c;在互联网应用中被广泛使用。在Nginx中&#xf…

ICode国际青少年编程竞赛- Python-2级训练场-迷宫

ICode国际青少年编程竞赛- Python-2级训练场-迷宫 1、 Dev.step(3) Dev.turnLeft() for i in range(2):Dev.step(4)Dev.turnRight() for i in range(2):Dev.step(2)Dev.turnLeft() Dev.step(3) Dev.step(-9)2、 Dev.step(3) Dev.turnRight() Dev.step(2) Dev.turnLeft() for i …

AI视频教程下载:给企业管理层和商业精英的ChatGpt课程

课程内容大纲&#xff1a; 1-引言 2-面向初学者的生成性人工智能 3-与ChatGPT一起学习提示101 详细介绍了如何使用ChatGPT的六种沟通模式&#xff0c;并提供了各种实际应用场景和示例&#xff1a; **Q&A模式&#xff08;问题与答案模式&#xff09;**&#xff1a; - 这…

区块链 | NFT 水印:Review on Watermarking Techniques(三)

&#x1f34d;原文&#xff1a;Review on Watermarking Techniques Aiming Authentication of Digital Image Artistic Works Minted as NFTs into Blockchains 一个 NFT 的水印认证协议 可以引入第三方实体来实现对交易的认证&#xff0c;即通过使用 R S A \mathsf{RSA} RSA…

96、技巧-只出现一次的数字

思路 首先不考虑额外空间的话使用一个set去重即可。第二种就是异或运算。 异或操作的性质 身份元素&#xff1a;任何数与0进行异或运算&#xff0c;结果仍然是原数&#xff0c;即 x ^ 0 x。自反性&#xff1a;任何数与自身进行异或运算&#xff0c;结果是0&#xff0c;即 x…

Spring Cloud Consul 4.1.1

该项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法&#xff0c;为 Spring Boot 应用程序提供 Consul 集成。通过一些简单的注释&#xff0c;您可以快速启用和配置应用程序内的常见模式&#xff0c;并使用基于 Consul 的组件构建大型分布式系统。提供的模式…

Python版Spark core详解

文章目录 第一章 SparkCore1.1. Spark环境部署1.1.1. Spark介绍1.1.1.1. 什么是Spark1.1.1.2. Spark与MapReduce的对比框架对比运行流程对比 1.1.1.3. Spark的组件1.1.1.4. Spark的特点 1.1.2. Spark的安装部署1.1.2.1. Spark安装包下载1.1.2.2. Spark部署模式介绍1.1.2.3. Loc…

解决Vue devtools插件数据变化不会自动刷新

我们使用devtools插件在监测vuex中表单或自定义组件的数据&#xff0c;发现页面数据发生变化后&#xff0c;但是devtools中还是老数据&#xff0c;必须手动点击devtools刷新才能拿到最新的数据。很烦&#xff01; 解决方案&#xff1a; 打开chrome的设置&#xff0c;向下翻&…