基于 PyQt5 的集成化运维工具箱,提供常用运维功能和工具。
• 🖥️ 系统检查 — 监测 CPU、内存、磁盘使用情况
• 📋 日志分析 — 分析日志文件,统计 ERROR/WARNING,关键词搜索,支持大文件分页
• 🌐 网络工具 — Ping 连通性测试、常用端口批量扫描、自定义端口检测、CIDR 网段扫描、DNS 域名解析
• 🔍 设备发现 — 局域网设备扫描与类型识别(Web 服务器、数据库、打印机等)
• 🔐 SSH 工具 — SSH 远程连接、交互式终端、远程命令执行、文件上传下载,支持华为/Cisco/H3C 设备自动适配
• 📟 Telnet 工具 — Telnet 远程连接与系统信息查询(老旧网络设备管理)
• 💾 备份工具 — 单文件复制备份、目录 ZIP 压缩备份,自动命名,支持清理旧备份
• 📖 Linux 命令查询 — 内置 75 条常用 Linux 命令速查,点击自动按分类展示(文件操作/系统管理/网络诊断等),支持精确匹配和关键词模糊搜索
• 🤖 AI 助手 — AI 运维问答(支持 DeepSeek / Groq / 自定义 OpenAI 兼容接口),聊天式多轮对话
• 模块按分类分组展示,支持折叠/展开(点击分类标题收起或展开该分类下的模块卡片)
• 卡片式交互,快速定位
• 命令执行保护 — 当前命令执行中重复点击会弹窗提示,防止冲突
• 现代化 PyQt5 图形界面,启动时自动适配屏幕大小
• 免责声明 — 首次运行弹出免责声明对话框,需同意后方可使用
• 自动更新 — 启动时自动检查新版本,提示更新日志和下载链接
• 用户反馈 — 工具栏内置反馈入口,通过邮件提交建议和 Bug
• 日志查看器 — 工具栏内置运行日志查看器,实时滚动
• 输出面板实时滚动,SSH/Telnet 交互式终端
pip install -r requirements.txt
python main.py
Oamc/
├── main.py # 主程序入口
├── requirements.txt # Python 依赖
├── README.md # 项目说明
├── 运维宝典.spec # PyInstaller 打包配置
├── icon.ico # 程序图标
├── 开发日志.txt # 开发日志
├── config/
│ ├── __init__.py
│ ├── settings.py # 全局配置 + 模块注册表
│ └── app_config.json # 应用配置(AI Key 等)
├── core/
│ ├── __init__.py
│ ├── base_module.py # ⭐ BaseModule 基类(声明式模块开发)
│ └── module_manager.py # 模块管理器(动态加载/自动发现/热更新)
├── modules/
│ ├── __init__.py
│ ├── system_check.py # 系统检查
│ ├── log_analyzer.py # 日志分析
│ ├── network_tools.py # 网络工具
│ ├── network_device_discovery.py # 设备发现
│ ├── ssh_tools.py # SSH 工具
│ ├── telnet_tools.py # Telnet 工具
│ ├── backup_tools.py # 备份工具
│ ├── linux_commands.py # Linux 命令查询
│ └── ai_assistant.py # AI 助手
├── ui/
│ ├── __init__.py
│ ├── main_window.py # 主窗口(布局/工具栏/模块执行/Schema驱动UI)
│ ├── widgets.py # 自定义组件(ModuleCard/OutputPanel/StatusBar)
│ ├── workers.py # 后台工作线程(ModuleWorker/AIChatWorker/SSHReconnect)
│ ├── ssh_terminal.py # SSH 交互式终端组件
│ ├── log_viewer.py # 日志查看器对话框
│ ├── disclaimer_dialog.py # 免责声明对话框
│ ├── feedback_dialog.py # 用户反馈对话框(邮件发送)
│ ├── style.py # 全局样式表
│ └── stdout_redirector.py # stdout 重定向
├── utils/
│ ├── __init__.py
│ ├── helpers.py # 通用工具函数
│ └── log_manager.py # 日志管理器
├── bale/
│ └── bale.py # 一键打包脚本
└── logs/ # 运行日志目录
使用 BaseModule 声明式开发(自动注册,无需手动配置)。
继承 core.base_module.BaseModule,声明类属性即可自动注册——无需修改 settings.py 或 main_window.py。
在 modules/ 目录下创建 my_tool.py:
from core.base_module import BaseModule
class MyTool(BaseModule):
# ── 基本信息(必填)──
module_id = "my_tool"
name = "我的工具"
description = "一个简单的示例模块"
icon = "✨"
category = "运维知识"
# ── 输入框配置 ──
input_hint = "请输入参数"
input_placeholder = "输入参数..."
show_input_field = True # 显示输入框
show_execute_button = True # 显示"执行"按钮
auto_run = False # False = 等待用户输入再执行
def run(self, target=None):
"""模块主入口。target 为用户在输入框中输入的内容"""
self.print_separator("=")
self.print_info(f"接收到参数: {target or '(无)'}")
self.print_success("模块执行成功!")
self.print_separator("=")
return True
运行程序,模块自动出现在界面中! 🎉
| 属性 | 类型 | 说明 |
module_id | str | 必填,唯一标识符(英文+下划线) |
name | str | 必填,卡片标题 |
description | str | 必填,卡片副标题 |
icon | str | Emoji 图标,默认 🔧 |
category | str | 分类名称,默认 其他 |
input_hint | str | 输入框上方提示文字 |
input_placeholder | str | 输入框占位文字 |
show_input_field | bool | 是否显示通用输入框 |
show_execute_button | bool | 是否显示"执行"按钮 |
execute_button_text | str | 执行按钮文字,默认 ▶ 执行 |
auto_run | bool | True = 点击即执行(无需输入) |
| 特殊行为 | ||
is_ai_module | bool | 是否为 AI 对话模块 |
is_ssh_module | bool | 是否为 SSH 终端模块 |
is_log_module | bool | 是否为日志分析模块 |
| 专用按钮区 | ||
show_network_buttons | bool | 显示网络工具按钮(Ping/端口扫描等) |
show_ssh_buttons | bool | 显示 SSH 专用按钮(连接/断开/上传/下载) |
show_ai_buttons | bool | 显示 AI 专用按钮(设置Key/清空对话等) |
use_ssh_inputs | bool | 显示 SSH 连接信息输入(主机/端口/用户名/密码) |
class MyModule(BaseModule):
def run(self, target=None):
self.print_separator("=", 60) # ═══════════════════════
self.print_success("操作成功") # [✓] 操作成功
self.print_error("操作失败") # [✗] 操作失败
self.print_warning("警告信息") # [!] 警告信息
self.print_info("普通信息") # [•] 普通信息
class MyModule(BaseModule):
def on_registered(self):
"""模块注册成功时调用(可重写)"""
pass
def on_loaded(self):
"""模块首次加载到内存时调用(可重写)"""
pass
modules/process_manager.py:
from core.base_module import BaseModule
try:
import psutil
PSUTIL_AVAILABLE = True
except ImportError:
PSUTIL_AVAILABLE = False
class ProcessManager(BaseModule):
module_id = "process_manager"
name = "进程管理"
description = "查看和管理系统进程"
icon = "⚙️"
category = "系统监控"
auto_run = True # 点击卡片直接执行
def run(self, target=None):
self.print_separator("=")
self.print_info("CPU 占用最高的进程")
if not PSUTIL_AVAILABLE:
self.print_error("psutil 未安装,请执行: pip install psutil")
return False
self.print_separator("-")
print(f"{'PID':<10} {'名称':<30} {'CPU%':<10} {'内存':<15}")
processes = []
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_info']):
try:
processes.append(proc.info)
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
processes.sort(key=lambda x: x.get('cpu_percent', 0) or 0, reverse=True)
for proc in processes[:10]:
pid = proc.get('pid', 'N/A')
name = (proc.get('name', 'N/A') or '')[:28]
cpu = proc.get('cpu_percent', 0) or 0
mem = proc.get('memory_info')
mem_str = f"{mem.rss / 1024 / 1024:.1f} MB" if mem else "N/A"
print(f"{pid:<10} {name:<30} {cpu:<10.1f} {mem_str:<15}")
self.print_separator("=")
self.print_success("进程信息获取完成")
return True
def run(self, target=None):
try:
do_something()
self.print_success("执行成功")
except Exception as e:
self.print_error(f"执行失败: {e}")
import traceback
traceback.print_exc()
return False
return True
try:
import some_library
LIB_AVAILABLE = True
except ImportError:
LIB_AVAILABLE = False
class MyModule(BaseModule):
def run(self, target=None):
if not LIB_AVAILABLE:
self.print_error("缺少依赖: some_library")
self.print_info("请执行: pip install some_library")
return False
# 正常功能...
def run(self, target=None):
self.print_separator("=") # ══════════════════════════
self.print_info("开始处理...") # [•] 开始处理...
self.print_warning("注意!") # [!] 注意!
self.print_success("完成") # [✓] 完成
程序启动
│
├── 1. 加载 AVAILABLE_MODULES 中的传统格式模块
├── 2. 若 AUTO_DISCOVER_MODULES = True
│ └── 扫描 modules/*.py → 查找 BaseModule 子类 → 自动注册
└── 3. UI 根据注册结果渲染模块卡片
Schema 驱动 UI:模块通过 get_input_schema() 声明界面行为(是否显示输入框、执行按钮、网络/SSH/AI 专用按钮等),main_window 无需为每个模块写硬编码分支。
• 主界面:左侧卡片式模块选择(按分类分组,点击分类标题可折叠/展开),右侧实时输出
• 工具栏:📋 查看日志 → 🔄 检查更新 → 💬 反馈 → 🔄 热更新模块 → ℹ️ 关于 → 🚪 退出
• 免责声明:首次启动显示免责声明对话框,滚动查看条款后确认
• 自动更新:启动时自动检查新版本(通过 UPDATE_CHECK_URL 配置),有更新时弹窗提示
• 用户反馈:填写建议/Bug 报告后通过邮件发送至开发团队
• 输出面板:Consolas 等宽字体,自动滚动
• SSH/Telnet 终端:连接成功后切换为交互式终端模式,SSH 支持文件上传下载
• 命令执行保护:当前命令执行中再次点击会弹窗提示,避免冲突
• 状态栏:实时状态指示 + 执行信息
• Python 3.6+
• PyQt5 — 图形界面框架
• psutil — 系统资源监控
• paramiko — SSH 远程连接
• 标准库 — os, sys, socket, shutil, zipfile, json, logging, ipaddress, smtplib, email, importlib, inspect, pathlib 等
项目提供一键打包脚本,自动完成图标生成、UPX 压缩、构建和清理:
python bale/bale.py
| 步骤 | 说明 |
| 🎨 图标生成 | 自动从 emoji 生成多尺寸 icon.ico(需安装 Pillow) |
| 🔍 UPX 检测 | 自动检测项目根目录 upx/ 下的 UPX 压缩工具(可减小 30%-70% 体积) |
| 🧹 清理旧文件 | 删除 build/、dist/、旧的 .spec 文件 |
| 🚀 PyInstaller 构建 | 自动收集所有模块和数据文件,构建 exe |
| 📋 复制文件 | 目录模式下自动复制 README 等额外文件 |
运行脚本后可选择:
• 模式 1:单文件 exe(推荐,便于分发)
• 模式 2:目录模式(启动更快)
打包前需安装:
pip install pyinstaller Pillow
下载 UPX 解压至项目根目录的 upx/ 文件夹中,脚本会自动检测并启用,进一步减小 exe 体积。
如需手动打包,也可使用预置的 spec 文件:
pyinstaller 运维宝典.spec
Q: 我创建的 BaseModule 模块没有显示?
• 文件是否在 modules/ 目录下(.py 文件)
• 类名是否继承自 BaseModule
• module_id 是否已填写(且不与其他模块重复)
• 检查类属性是否有拼写错误
Q: AI 助手如何使用?
• 点击左侧 🤖 AI 助手卡片
• 点击 🔑 设置Key 按钮输入 API Key(需自行注册获取)
• 选择 DeepSeek / Groq / 自定义 切换提供商
• 在输入框输入问题后点击发送
Q: 如何让输出更美观?
使用 BaseModule 内置方法:
self.print_separator("=") # ══════════════════════════
self.print_success("完成") # [✓] 完成
self.print_warning("注意") # [!] 注意
self.print_error("失败") # [✗] 失败
self.print_info("信息") # [•] 信息
Q: 可以使用第三方库吗?
• 在模块中正常 import
• 做好异常处理和依赖检查
• 在 requirements.txt 中补充依赖
MIT License
Oamc Team
享受便捷的运维体验! 🎉