一、脚本编写思路
(一)针对设备型号
主要针对华为(Huawei)和华三(H3C)交换机设备的配置备份
(二)导出前预处理
1.在配置导出前,自动打开crt软件或者MobaXterm软件,并自动登录交换机,进行配置导出。
4.自动检测被导出交换机是否搭建ftp配置,如果没有配置ftp服务,自动完善ftp配置,并自动完善交换机设备和电脑ftp配置文件的传输设备。
2.需要密码登录的交换机,在桌面自动读取一个表格文档,名称为:【交换机设备信息表】的表格文件。
3.根据读取到的文档,新建ssh会话,输入文本的IP,管理员账号和密码,并自动登录设备。
(三)配置文件导出格式
1.将所有配置导出文件保存到桌面并新建一个文件夹名称为:时间戳+交换机,
2.每个导出交换机配置名称保存为:设备命名+设备型号+时间戳。
3.导出的同一设备配置文件格式必须同时包含TXT文本和cfg
二、函数依赖库
为了运行Python脚本,需要确保已经安装了几个特定的Python库。这些库包括用于处理网络连接、文件操作和数据处理的工具。以下是必须安装的库列表及其用途:
- paramiko: 用于处理SSH连接和会话,这对于与交换机进行通信非常重要。
- pandas: 用于读取和处理Excel文件中的数据,这是从桌面读取设备信息的关键部分。
- openpyxl: 这不是脚本中直接提到的,但它是
pandas
用于处理Excel文件的依赖库,特别是.xlsx
文件。 - socket: 这是标准库中的一部分,用于获取本机IP地址,通常不需要单独安装。
(一)安装步骤
你可以通过Python的包管理器pip来安装所需的库。在你的命令行工具中运行以下命令来安装这些库:
pip install paramiko pandas openpyxl
这条命令会安装paramiko
和pandas
,同时确保openpyxl
也被安装,使得pandas
可以处理Excel文件。
(二)确保环境配置正确
在运行脚本之前,还应确保你的Python环境配置正确,特别是Python版本。这个脚本应该在Python 3.x环境中运行无误。你可以通过运行python --version
或python3 --version
(取决于你的系统配置)来检查你的Python版本。
(三)安装示例
(四)确保环境配置正确
在运行脚本之前,还应确保你的Python环境配置正确,特别是Python版本。这个脚本应该在Python 3.x环境中运行无误。你可以通过运行python --version
或python3 --version
(取决于你的系统配置)来检查你的Python版本。
如果你是在一个新的环境或虚拟环境中工作,确保所有库都按需安装。这样可以避免影响系统中其他Python项目的依赖。
三、Python脚本
import paramiko # 导入paramiko库用于SSH连接
import pandas as pd # 导入pandas库处理Excel文件
import os # 导入os库进行文件系统操作
from datetime import datetime # 导入datetime库获取时间戳
import time # 导入time库用于暂停操作
import socket # 导入socket库用于获取本机IP地址
# 读取设备信息表
def read_device_info():
file_path = os.path.join(os.path.expanduser('~'), 'Desktop', '交换机设备信息表.xlsx') # 构造文件路径
return pd.read_excel(file_path) # 使用pandas读取Excel文件并返回
# 获取本机IP地址
def get_local_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建UDP socket
try:
s.connect(('10.255.255.255', 1)) # 尝试连接到一个不存在的地址以获取本机IP
IP = s.getsockname()[0] # 获取成功后的本机IP地址
except Exception:
IP = '127.0.0.1' # 如果获取失败,使用本地回环地址
finally:
s.close() # 关闭socket
return IP
# 创建文件夹用于存放配置
def create_folder():
timestamp = datetime.now().strftime("%Y%m%d%H%M%S") # 获取当前时间戳
folder_name = f"{timestamp}_交换机" # 定义文件夹名
folder_path = os.path.join(os.path.expanduser('~'), 'Desktop', folder_name) # 定义完整路径
os.makedirs(folder_path, exist_ok=True) # 创建文件夹,如果存在则忽略
return folder_path
# 设置FTP服务
def setup_ftp(ssh, local_ip):
commands = [
'display ftp-server configuration\n', # 查看FTP服务器配置
'ftp server enable\n', # 启用FTP服务的命令
f'ftp server acl permit source ip {local_ip}\n' # 设置FTP服务的访问控制,允许本机IP访问
]
ssh.send(commands[0]) # 发送第一个命令
time.sleep(2) # 等待命令执行
output = ssh.recv(65535).decode('utf-8') # 读取输出
if 'FTP server is not configured' in output: # 如果FTP服务未配置
for command in commands[1:]: # 遍历并执行剩余命令
ssh.send(command)
time.sleep(1)
# 导出配置文件
def export_config(ip, username, password, device_info, folder_path):
client = paramiko.SSHClient() # 创建SSH客户端
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 自动接受新的SSH密钥
client.connect(ip, username=username, password=password) # 连接到设备
local_ip = get_local_ip() # 获取本机IP地址
with client.invoke_shell() as ssh: # 开启一个新的SSH会话
setup_ftp(ssh, local_ip) # 调用函数检查并配置FTP
commands = ['display current-configuration\n', 'save\n'] # 定义配置备份命令
for command in commands: # 循环发送命令
ssh.send(command)
time.sleep(5) # 等待命令执行
output = ssh.recv(65535).decode('utf-8') # 读取配置输出
timestamp = datetime.now().strftime("%Y%m%d%H%M%S") # 重新获取时间戳
filename_base = f"{device_info['设备命名']}_{device_info['设备型号']}_{timestamp}" # 构造文件名
with open(os.path.join(folder_path, f"{filename_base}.txt"), 'w') as file_txt: # 保存为txt文件
file_txt.write(output)
with open(os.path.join(folder_path, f"{filename_base}.cfg"), 'w') as file_cfg: # 保存为cfg文件
file_cfg.write(output)
client.close() # 关闭SSH客户端
# 主函数
def main():
folder_path = create_folder() # 创建文件夹
device_info = read_device_info() # 读取设备信息
for index, row in device_info.iterrows(): # 遍历设备信息
export_config(row['IP'], row['管理员账号'], row['密码'], row, folder_path) # 导出配置
if __name__ == "__main__":
main() # 运行主函数