
这份脚本主要用于通过 SSH 连接网络设备(锐捷设备)并收集配置信息,采用了模块化的逻辑设计。以下从功能模块的角度进行解释:
1. 依赖导入模块
from netmiko import ConnectHandler
import time
import os
- 功能:导入脚本运行所需的外部库
netmiko.ConnectHandler:用于建立与网络设备的 SSH 连接并执行命令(支持多厂商设备,这里针对锐捷)time:用于生成时间戳(避免文件重名)和记录收集时间os:用于处理文件路径(获取下载目录、拼接文件路径等)
2. 路径配置模块
# 获取macOS下载目录路径(默认用户下载目录)
downloads_path = os.path.expanduser("~/Downloads")
- 功能:定义文件保存的根目录
- 通过
os.path.expanduser("~/Downloads")获取当前用户的下载目录(适用于 macOS/Linux 系统) - 后续收集的设备信息文件将保存到该目录下
- 通过
3. 设备信息配置模块
# 设备信息(替换为实际设备信息)
network_info = [
{
'ip': 'x.x.x.x',
'username': 'xxxx',
'password': 'xxxx',
'port': 22,
'device_type': 'ruijie_os'
},
]
- 功能:存储需要连接的网络设备信息(可扩展为多设备)
- 每个字典代表一台设备的连接参数:
ip:设备管理 IP 地址username/password:SSH 登录账号密码port:SSH 端口(默认 22)device_type:设备类型(这里指定为锐捷ruijie_os,适配锐捷命令行)
- 每个字典代表一台设备的连接参数:
4. 命令配置模块
# 需要收集的命令
commands = [
'show version',
'show cpu',
'show memory',
'show ip int brief',
'show interface status',
'show ip route',
'show running-config'
]
- 功能:定义需要在设备上执行的命令列表
- 示例包含:查看运行配置(
show run)、设备版本(show version)、IP 接口摘要(show ip int brief) - 可根据需求扩展其他命令(如
show mac address-table等)
- 示例包含:查看运行配置(
5. 时间戳生成模块
# 生成时间戳(避免文件名重复)
timestamp = time.strftime("%Y%m%d_%H%M%S")
- 功能:生成唯一时间戳(格式:年月日_时分秒)
- 用于构建文件名,避免多设备 / 多次运行时文件覆盖
6. 主逻辑模块(设备连接与信息收集)
for info_dict in network_info:
# 设备IP与文件路径处理
device_ip = info_dict['ip']
file_name = f"{device_ip}_{timestamp}.txt"
file_path = os.path.join(downloads_path, file_name)
try:
# 建立SSH连接
ssh_conn = ConnectHandler(** info_dict)
print(f"\n{'#' * 20} 开始收集设备 {device_ip} 的信息 {'#' * 20}\n")
# 写入文件(含命令执行结果)
with open(file_path, 'w', encoding='utf-8') as f:
# 写入文件头部信息
f.write(f"设备IP: {device_ip}\n")
f.write(f"收集时间: {time.strftime('%Y-%m-%d %H:%M:%S')}\n")
f.write("=" * 50 + "\n\n")
# 循环执行命令并保存结果
for cmd in commands:
print(f"===== 执行命令: {cmd} =====")
output = ssh_conn.send_command(cmd) # 执行命令并获取输出
# 控制台打印结果
print(output)
print(f"\n{'-' * 80}\n")
# 写入文件
f.write(f"===== 命令: {cmd} =====\n")
f.write(output + "\n\n")
f.write("-" * 80 + "\n\n")
# 断开连接
ssh_conn.disconnect()
print(f"{'#' * 20} 设备 {device_ip} 信息收集完成 {'#' * 20}")
print(f"文件已保存至: {file_path}\n")
except Exception as e:
# 错误处理
error_msg = f"设备 {device_ip} 操作失败: {str(e)}"
print(error_msg)
# 保存错误信息到文件
with open(file_path, 'w', encoding='utf-8') as f:
f.write(error_msg)
- 功能:核心执行逻辑,按设备循环处理
- 文件路径构建:以 “设备 IP_时间戳.txt” 为文件名,拼接下载目录路径
- SSH 连接:通过
ConnectHandler建立与设备的连接 - 信息写入:
- 先写入文件头部(设备 IP、收集时间等元信息)
- 循环执行
commands中的命令,获取输出后同时打印到控制台和写入文件
- 连接关闭:完成后断开 SSH 连接
- 异常处理:若连接或执行命令失败,捕获错误并将错误信息写入文件
总结
整个脚本通过模块化设计,将 “依赖导入、路径配置、设备信息、命令列表、时间戳生成、主逻辑执行” 拆分为独立功能块,逻辑清晰且易于维护。可通过修改network_info(添加设备)和commands(扩展命令)来适应不同的网络设备信息收集需求。
322

被折叠的 条评论
为什么被折叠?



