网络设备配置自动备份与上传脚本
个人博客
个人博客直达地址
网站不断完善中里面拥有大量的脚本,并且源码完全开放 欢迎纯白嫖。
1. 功能概述
这个Python脚本旨在自动化网络设备的配置备份流程,具有以下主要功能:
- 通过Telnet连接多个网络设备
- 执行配置备份命令
- 将备份文件保存到本地指定目录
- 对特定设备执行FTP上传操作
- 使用多线程技术提高备份效率
2. 详细功能说明
2.1 设备连接
- 使用Telnet协议连接网络设备
- 支持多个设备的批量操作
- 可配置不同设备的登录凭证
2.2 配置备份
- 自动执行配置显示命令
- 解析并提取有效的配置信息
- 支持不同设备型号的命令差异
2.3 文件管理
- 自动创建以当前日期命名的备份目录
- 生成包含设备IP、主机名和时间戳的唯一文件名
- 将备份文件保存到指定目录
2.4 FTP上传
- 针对特定设备(如100.100.100.1)执行FTP上传操作
- 支持配置FTP服务器信息和远程文件名
2.5 多线程处理
- 使用ThreadPoolExecutor实现多线程并发备份
- 提高大量设备备份时的效率
3. 使用说明
3.1 环境准备
- 确保安装了Python 3.x版本
- 安装所需的第三方库:pip install chardet
3.2 配置脚本
- 设置设备登录信息:
- 修改
username
变量为设备的登录用户名 - 在
passwords
字典中配置设备的IP地址和对应的密码
- 配置FTP服务器信息:
- 修改
ftp_host
、ftp_username
、ftp_password
和ftp_remote_file
变量
- 设置目标设备列表:
- 在
ip_list
中添加或删除需要备份的设备IP地址
3.3 运行脚本
- 将脚本保存为
.py
文件,如network_backup.py
- 在终端中运行脚本:python network_backup.py
- 脚本将自动连接设备、执行备份、保存文件并上传(如果适用)
4. 注意事项
- 安全性:
- 确保脚本在安全的环境中运行,避免敏感信息泄露
- 考虑使用环境变量或配置文件存储敏感信息,而不是直接在脚本中硬编码
- 网络环境:
- 确保运行脚本的主机能够访问所有目标网络设备
- 检查防火墙设置,确保Telnet(端口23)和FTP(端口21)流量允许通过
- 设备兼容性:
- 脚本可能需要根据不同设备型号调整命令语法
- 测试脚本在各种设备型号上的兼容性
- 错误处理:
- 脚本包含基本的错误处理机制,但在生产环境中可能需要更健壮的异常处理和日志记录
- 性能考虑:
- 多线程处理可能会增加网络和设备的负载,请根据实际情况调整
max_workers
参数
- 文件管理:
- 定期检查和清理备份文件,避免存储空间耗尽
- 考虑实施备份文件的自动归档和清理机制
- 测试:
- 在应用到生产环境之前,务必在测试环境中充分测试脚本
- 验证备份文件的完整性和可用性
- 文档化:
- 保持脚本文档的更新,包括任何修改和定制
- 记录运行脚本的步骤和故障排除指南
- 合规性:
- 确保脚本的使用符合组织的安全策略和行业规定
- 考虑实施访问控制和审计机制
- 可扩展性:
- 考虑将常用配置参数移至单独的配置文件中,便于维护和更新
- 设计脚本结构以便于未来添加新功能或支持新设备类型
#!/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}')