防火墙-交换机配置文件备份

网络设备配置自动备份与上传脚本

个人博客

个人博客直达地址
网站不断完善中里面拥有大量的脚本,并且源码完全开放 欢迎纯白嫖。

1. 功能概述

这个Python脚本旨在自动化网络设备的配置备份流程,具有以下主要功能:

  1. 通过Telnet连接多个网络设备
  2. 执行配置备份命令
  3. 将备份文件保存到本地指定目录
  4. 对特定设备执行FTP上传操作
  5. 使用多线程技术提高备份效率

2. 详细功能说明

2.1 设备连接

  • 使用Telnet协议连接网络设备
  • 支持多个设备的批量操作
  • 可配置不同设备的登录凭证

2.2 配置备份

  • 自动执行配置显示命令
  • 解析并提取有效的配置信息
  • 支持不同设备型号的命令差异

2.3 文件管理

  • 自动创建以当前日期命名的备份目录
  • 生成包含设备IP、主机名和时间戳的唯一文件名
  • 将备份文件保存到指定目录

2.4 FTP上传

  • 针对特定设备(如100.100.100.1)执行FTP上传操作
  • 支持配置FTP服务器信息和远程文件名

2.5 多线程处理

  • 使用ThreadPoolExecutor实现多线程并发备份
  • 提高大量设备备份时的效率

3. 使用说明

3.1 环境准备

  1. 确保安装了Python 3.x版本
  2. 安装所需的第三方库:pip install chardet

3.2 配置脚本

  1. 设置设备登录信息:
  • 修改username变量为设备的登录用户名
  • passwords字典中配置设备的IP地址和对应的密码
  1. 配置FTP服务器信息:
  • 修改ftp_hostftp_usernameftp_passwordftp_remote_file变量
  1. 设置目标设备列表:
  • ip_list中添加或删除需要备份的设备IP地址

3.3 运行脚本

  1. 将脚本保存为.py文件,如network_backup.py
  2. 在终端中运行脚本:python network_backup.py
  3. 脚本将自动连接设备、执行备份、保存文件并上传(如果适用)

4. 注意事项

  1. 安全性
  • 确保脚本在安全的环境中运行,避免敏感信息泄露
  • 考虑使用环境变量或配置文件存储敏感信息,而不是直接在脚本中硬编码
  1. 网络环境
  • 确保运行脚本的主机能够访问所有目标网络设备
  • 检查防火墙设置,确保Telnet(端口23)和FTP(端口21)流量允许通过
  1. 设备兼容性
  • 脚本可能需要根据不同设备型号调整命令语法
  • 测试脚本在各种设备型号上的兼容性
  1. 错误处理
  • 脚本包含基本的错误处理机制,但在生产环境中可能需要更健壮的异常处理和日志记录
  1. 性能考虑
  • 多线程处理可能会增加网络和设备的负载,请根据实际情况调整max_workers参数
  1. 文件管理
  • 定期检查和清理备份文件,避免存储空间耗尽
  • 考虑实施备份文件的自动归档和清理机制
  1. 测试
  • 在应用到生产环境之前,务必在测试环境中充分测试脚本
  • 验证备份文件的完整性和可用性
  1. 文档化
  • 保持脚本文档的更新,包括任何修改和定制
  • 记录运行脚本的步骤和故障排除指南
  1. 合规性
  • 确保脚本的使用符合组织的安全策略和行业规定
  • 考虑实施访问控制和审计机制
  1. 可扩展性
  • 考虑将常用配置参数移至单独的配置文件中,便于维护和更新
  • 设计脚本结构以便于未来添加新功能或支持新设备类型
#!/usr/bin/python3

import telnetlib
import datetime
import time
import os
import re
import chardet
import ftplib
from concurrent.futures import ThreadPoolExecutor
import shutil

# 定义 Telnet 端口和超时时间
port = 23
timeout = 10

# 定义登录用户名
username = 'admin'

# 定义密码字典
passwords = {
    '100.100.100.1': '********',  # 脱敏处理的密码
    'default': '********'          # 脱敏处理的默认密码
}

# 定义 FTP 服务器信息
ftp_host = '10.1.6.175'
ftp_username = 'zmk'
ftp_password = '********'        # 脱敏处理的 FTP 密码
ftp_remote_file = 'usg6365e.cfg'

# 定义目标设备 IP 地址列表
ip_list = ['100.100.100.1', '10.1.0.1', '10.1.0.2', '10.1.0.3', '10.1.0.4', '10.1.0.5',
           '10.1.0.6', '10.1.0.7', '10.1.0.8', '10.1.0.9', '10.1.0.10', '10.1.0.12',
           '10.1.0.14', '10.1.0.15', '10.1.0.16', '10.1.0.17', '10.1.0.18']

# 获取当前日期作为文件夹名
date_today = datetime.datetime.now().strftime("%Y%m%d")

# 如果当前日期的文件夹不存在,则创建它
if not os.path.exists(date_today):
    os.mkdir(date_today)

def backup(ip):
    try:
        print(f'正在连接设备 {ip}')
        # 创建 Telnet 对象并连接设备
        tn = telnetlib.Telnet(ip, port, timeout)
        # 输入用户名
        tn.read_until(b'Username:')
        tn.write((username + '\n').encode())
        # 根据 IP 地址选择密码
        password = passwords.get(ip, passwords['default'])
        # 输入密码
        tn.read_until(b'Password:')
        tn.write((password + '\n').encode())
        # 等待密码验证通过
        time.sleep(1)
        # 如果是 100.100.100.1, 则直接执行 FTP 命令
        if ip == '100.100.100.1':
            print(f'正在使用 FTP 备份设备 {ip}')
            tn.write(b'ftp 10.1.6.175\n')
            tn.read_until(b'User(10.1.6.175:(none)):')
            tn.write(b'zmk\n')
            tn.read_until(b'Enter password:')
            tn.write(b'********\n')  # 脱敏处理的 FTP 密码
            tn.read_until(b'[ftp]')
            tn.write(b'put usg6365e.cfg\n')
            tn.read_until(b'226-File successfully transferred')
            tn.write(b'quit\n')
            print(f'FTP 上传成功')
        # 其他设备使用原有的备份方式
        else:
            # 关闭回显
            tn.write((f'screen-length 0 temporary\n').encode())
            time.sleep(1)
            # 进入命令行模式
            tn.write(('system-view\n').encode())
            # 执行备份配置命令
            tn.write((f'display current-configuration\n').encode())
            print(f'准备开始备份 {ip}')
            # 命令执行完成后,读取回显
            time.sleep(10)
            output_data = tn.read_very_eager()
            detected_encoding = chardet.detect(output_data)['encoding']
            output = output_data.decode(detected_encoding)
            # 获取设备主机名
            hostname = re.search(r'\[(.*?)\]', output).group(1)
            # 删除当前主机名
            output = output.replace(f'[{hostname}]', '')
            # 找到备份配置的起始位置
            start_index = output.find('display current-configuration')
            if start_index >= 0:
                output = output[start_index+len('display current-configuration'):]
            else:
                raise Exception('Could not find the start of the configuration to backup')
            # 删除输出中的空行
            output = '\n'.join([line for line in output.splitlines() if line.strip() != ''])
            # 生成文件名并保存到当前日期的文件夹下
            filename = f'{date_today}/{ip}_{hostname}_{datetime.datetime.now().strftime("%H%M%S")}.txt'
            with open(filename, 'w', encoding=detected_encoding) as file:
                file.write(output)
            print(f'设备 {ip} 的配置已备份到 {filename}')
    except TimeoutError as e:
        print(f'连接设备 {ip} 超时,正在尝试连接下一个设备')
    except Exception as e:
        print(f'处理设备 {ip} 时发生错误: {e}')
    finally:
        tn.close()

# 使用多线程进行备份
with ThreadPoolExecutor(max_workers=20) as executor:
    executor.map(backup, ip_list)

# 备份完成后,移动 FTP 下载的配置文件
source_file = '/opt/shell/switch/usg6365e.cfg'
target_file = f'{date_today}/usg6365e.cfg'
shutil.move(source_file, target_file)
print(f'配置文件 {source_file} 已移动到 {target_file}')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脚本小能手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值