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, 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.mfbz.cn/a/610261.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

能源系统升级BACnet IP分布式I/O边缘模块深度整合

能源管理系统(EMS)的高效运行成为了实现绿色建筑、节能减排的关键。而BACnet IP分布式远程I/O模块作为这一系统中的重要组件,正发挥着不可小觑的作用。本文将以某大型商业综合体为例,探讨BACnet IP I/O模块如何在能源管理中大显身手。 商业综合体涵盖办公…

揭秘APP广告变现:轻松赚取额外收入!

在移动应用(APP)的世界中,变现能力是衡量一个应用成功与否的关键指标之一。无论是个人开发者还是企业团队,如何通过应用创造收入,始终是一个备受关注的话题。今天,我们将深入探讨APP广告变现的路径&#xf…

【ElementUI -- 优化小技巧系列】 -- el-tree 节点内容过长优化 以及选中默认节点

在使用elementui过程中经常碰到关于样式的问题,我曾经很喜欢通过类名修改css样式来做,其实原生封装的elementui库的样式对于普通开发来说已经足够了,通过类名修改css只会让组件臃肿难以维护,现在真的越来越怕写css,经常…

镜舟科技亮相2024中国移动算力网络大会、Qcon、DTC等多项活动

在刚刚过去的 4 月份,镜舟科技受邀参与一系列技术交流活动,与移动云、金科创新社、infoQ、墨天轮、开科唯识等媒体及合作伙伴展开积极交流,并分享其在数据技术、金融等垂直行业领域的创新实践,从产业侧、业务侧、技术侧洞察需求、…

基于springboot+mybatis+vue的项目实战之页面参数传递

如图所示&#xff0c;删除操作可以用按钮实现&#xff0c;也可以用超链接来实现。 1、第一种情况&#xff0c;用按钮实现。 html页面相关&#xff1a; <button type"button" click"deleteId(peot.id)">删除</button> <script>new Vue(…

Redis 支持的 Java 客户端都有哪些?

Redis 是一种高性能的键值存储系统&#xff0c;它以其快速、灵活和可扩展的特性而闻名。在 Java 开发中&#xff0c;与 Redis 交互的方式通常是通过使用 Redis 的 Java 客户端。 这些客户端提供了访问 Redis 数据库的接口&#xff0c;使开发人员能够在 Java 应用程序中轻松地使…

活动报名 | 某头部股份制银行,构建实时指标平台的最佳实践

&#x1f449;欢迎到镜舟科技公众号报名了解研讨会 数字化转型不仅是一场技术革命&#xff0c;更是企业决策模式的革新。在这一过程中&#xff0c;数据成为企业最宝贵的资产&#xff0c;实时数据分析对企业决策至关重要。 随着业务复杂性增加&#xff0c;各业务部门数据指标越…

【概率论基础】 一篇文章缕清概率论常见概念关系

碎碎念&#xff1a;再写CSDN之前有一小段时间写数模公众号的经历&#xff0c;但是公众号看的人实在太少了&#xff0c;而且排版和公式、代码编辑都没有CSDN这么方便&#xff0c;所以坚持一算时间就没有更新了。公众号大多写的是概念性的基础&#xff0c;稍加修改搬到咱们的主战…

人人都是开发者?Baidu Comate智能代码助手改变你传统的编程之路

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、人人都是开发者二、Baidu Comate 智能编码助手2.1 Baidu Comate 是什么&#xff1f;2.2 Baidu Comate 支持那…

5到15秒片头音乐200款,30秒片头音效音乐大全

一、素材描述 本套音乐音效素材&#xff0c;大小2.88G&#xff0c;13个压缩文件。 二、素材目录 200个5到15秒的片头音乐.zip 30秒片头-1.zip 30秒片头-2.zip 30秒片头-3.zip 30秒片头-4.zip 30秒片头-5.zip 30秒片头-6.zip 30秒片头-7.zip 30秒片头-8.zip 30秒片头…

海睿思受邀参加 “走进中节能”研习交流,探索新能源数据治理的创新路径

近日&#xff0c;OceanMind海睿思参加由江苏省企业信息化协会&#xff08;以下简称“苏信会”&#xff09;主办的“走进中节能太阳能科技&#xff08;镇江&#xff09;有限公司”研习交流活动。 海睿思与苏美达、远东控股、隆基乐叶、固德威、上能电气等40多位来自制造业领域的…

Unity使用ToggleGroup对多个Toggle进行管理时,初始化默认选项失效的问题

问题描述&#xff1a; 在unity脚本的OnEnable中用代码设置Toggle集合中的其中一个对象的ison时&#xff0c;发现并没有根据设置发生变化。但是该Toggle的OnValueChange却发生过变化。 如果使用协程等待0.01s,那么对应组件的ison的修改才能生效&#xff0c;但是逐帧分析的话会发…

读写备份寄存器BKP与实时时钟RTC

文章目录 读写备份寄存器接线图代码 RTC实时时钟接线图代码 读写备份寄存器 接线图 即接个3.3v的电源到VBT引脚 代码 代码效果&#xff1a;第一次写入备份寄存器&#xff0c;下载程序后再注释掉&#xff0c;再进行下载&#xff0c;之前写入的数据还会保存在备份寄存器中&am…

JavaEE之线程(3)_线程的开始、中断、等待、休眠线程、线程的状态

前言 在本栏的上一节&#xff08;https://blog.csdn.net/2301_80653026/article/details/138500558&#xff09;&#xff0c;我们重点讲解了五种不同的创建线程的方式&#xff0c;我们还介绍了Tread类的常见构造方法和常见属性&#xff0c;在这一节中我们将会继续介绍Tread类。…

【SVN-TortoiseSVN】SVN 的简介与TortoiseSVN 安装使用教程

目录 &#x1f31e;前言 &#x1f30a;1. SVN 的简介 &#x1f30d;1.1 SVN是什么 &#x1f30d;1.2 SVN 工作原理 &#x1f30d;1.3 TortoiseSVN 术语及定义 &#x1f30a;2. TortoiseSVN 安装与汉化 &#x1f30a;3. SVN 基本操作-TortoiseSVN &#x1f30d;3.1 浏览…

在k8s中部署Prometheus并实现对k8s集群的监控

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Prometheus&#xff1a;监控的神》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、k8s简介 2、 Prometheus概述 二、准备k8s环境 1、…

C语言:__attribute__((packed))

一、简介 在使用结构体的时候&#xff0c;经常要根据结构体的长度来进行相关判断。但是按照C语言的规则&#xff0c;会对不同类型的数据类型进行自动对齐。有时候就会造成一些问题&#xff0c;如果不需要使用自动对齐的功能&#xff0c;就需要使用到本章的关键字。 二、自动对…

fabric搭建生产网络

fabric搭建生产网络 一、生成组织结构与身份证书 解包 hyperledger-fabric-linux-amd64-2.5.0.tar.gz 1.1、crypto-config.yaml配置文件 ./bin/cryptogen showtemplate > crypto-config.yaml 将crypto-config.yaml内容修改为&#xff1a; # -------------------------…

Django 管理员登录安全 OTP双因素认证

目前安全双因素 最基本的&#xff0c;django管理员 默认直接登录的。 本项目环境:Django 2.0.13django-otp 0.9.3 1 安装pip3 install django-otp0.9.3 2 配置文件 vim api_statistics/settings.py INSTALLED_APPS里增加django_otp,django_otp.plugins.otp_totp,MIDDLEWARE…

推荐几款国内的AI写作工具,好用免费还能在线生成AI文案

AI写作简介&#xff1a; 在专业领域中&#xff0c;人工智能技术的进步正以前所未有的速度推动着写作行业的革新。当前&#xff0c;我们见证了生成式人工智能&#xff08;AI&#xff09;在文本产生领域的广泛应用&#xff0c;其对提升创作效率和拓展创意边界的贡献是显著的。以…
最新文章