Fleet Console — Linux 服务器运维控制台
一个基于标准 SSH 的 Linux 主机管理 GUI 工具(PySide6 + paramiko)。
它解决的是「我手上有一堆 Linux 机器,想在一个窗口里管起来」这件事:多标签终端、SFTP 文件管理、多机批量执行、系统监控、审计日志,凭据用主密码加密保存在本机。
前提:只对你拥有或获得明确授权的主机使用。本工具不会在目标机器上安装任何组件、不驻留、不需要目标机开放额外端口,全部会话都走目标机本来就开放的 SSH 服务,并使用你自己提供的凭据。

1. 功能
| 模块 | 能力 |
|---|---|
| 主机清单 | 分组管理、密码 / 密钥 / ssh-agent 三种认证、凭据加密存储、右键测试连接、复制 ssh 命令 |
| 终端 | 多标签、完整 VT100/xterm 模拟器(颜色、光标、vim/htop 等全屏程序、滚轮回看历史)、窗口自适应 window-change、选择/复制/粘贴与「暂停跟随」 |
| 文件管理 | SFTP 浏览、上传/下载(进度 + 可取消)、新建目录、重命名、改权限、直接编辑小文本文件;传输先写 .part 再改名,中断不会污染目标文件 |
| 批量执行 | 勾选多台主机批量跑命令、实时回填结果、可停止、sudo 提权、导出 CSV |
| 系统监控 | CPU / 内存 / Swap / 各分区使用率、负载、运行时间、进程数,CPU 曲线 |
| 审计日志 | 连接、断开、命令、传输、主机变更全部落库,可筛选、导出 CSV、清空 |
| 安全开关 | 严格校验主机密钥(~/.ssh/known_hosts)、随时锁定凭据库 |
2. 安装
要求:Python 3.8+(必须 64 位,PySide6 没有 32 位轮子)、能访问 PyPI。
# Windows:一条命令搞定(创建 .venv 并安装 PySide6)
.\setup_env.cmd
# 手工做法(任意平台)
python -m venv .venv --system-site-packages # 复用已装的 paramiko/cryptography
.venv\Scripts\python.exe -m pip install PySide6==6.4.3 # Python 3.9+ 可直接装最新版
依赖只有三个:PySide6(界面)、paramiko(SSH/SFTP)、cryptography(凭据加密)。终端模拟器、图表、进度条都是项目内自己实现的,没有额外依赖。
3. 运行
.\run.bat # 或者
.venv\Scripts\python.exe main.py
首次启动会让你设置一个主密码:所有主机密码与私钥口令都用它派生的密钥(PBKDF2-HMAC-SHA256 39 万次 + AES/Fernet)加密后保存在本机,主密码本身不落盘,也无法找回。
数据文件都在用户目录下的 .fleet_console/(可用环境变量 FLEET_CONSOLE_HOME 改):
~/.fleet_console/vault.json # 加密后的凭据库
~/.fleet_console/inventory.db # 主机清单
~/.fleet_console/audit.db # 审计日志
4. 界面速览
┌──────────────┬──────────────────────────────────────────────┐
│ 主机列表 │ 终端 · web-01 │ 批量执行 │ 系统监控 │ 审计日志 │
│ ├ 生产 │ ┌──────────────────────────────────────────┐ │
│ │ ├ web-01 │ │ root@web-01:~# systemctl status nginx │ │
│ │ └ db-01 │ │ ● nginx.service - A high performance... │ │
│ └ 测试 │ │ │ │
│ └ cache-01 │ └──────────────────────────────────────────┘ │
│ [添加][编辑] │ 已连接 10.0.0.5:22,主机密钥 SHA256:xxxx │
└──────────────┴──────────────────────────────────────────────┘
快捷键:Ctrl+N 添加主机、Ctrl+T 打开终端、F5 刷新列表。
终端里的选择、复制与粘贴
| 操作 | 快捷键 |
|---|---|
| 复制选中内容 | Ctrl+C(有选区时才复制)、Ctrl+Shift+C、Ctrl+Insert |
| 粘贴 | Ctrl+V、Ctrl+Shift+V、Shift+Insert |
| 全选 | Ctrl+Shift+A |
| 中断远端程序 | Ctrl+C(没有选区时发送 SIGINT) |
- 鼠标直接拖动就能选择。一旦产生选区,输出会自动暂停,选区和滚动位置不会被重绘刷掉;想继续看最新输出:按
Esc、点工具栏「跟随输出」、或右键菜单里的「继续跟随输出」 - 用滚轮往上翻历史时同样会自动暂停,不会把你拽回底部;滚回底部即自动恢复
- 状态栏下方会显示「输出已暂停(选区 / 滚动位置已保留)」提示,不会让人误以为卡住了
- 输出暂停期间远端数据照常接收并存入历史缓冲,恢复后一次性补齐,不会丢内容
- 右键菜单:复制选中内容 / 复制全部输出 / 粘贴到终端 / 全选 / 暂停或继续跟随 / 清空本地屏幕
- 工具栏按钮:复制选区 / 粘贴 / 复制全部 / 清屏 / 跟随输出 / Ctrl+C / Ctrl+D,不依赖记快捷键
Ctrl+A留给远端 readline(行首),没有被抢走
5. 目录结构
main.py 入口:解锁凭据库 → 主窗口
app/config.py 路径与常量
app/core/ 纯逻辑层(不 import Qt,可独立测试)
crypto.py PBKDF2 + Fernet
vault.py 主密码保护的凭据库
inventory.py 主机清单(SQLite)
audit.py 审计日志(SQLite)
ssh_client.py paramiko 封装:认证、exec、PTY、SFTP
terminal.py 自研 VT100/xterm 模拟器
monitor.py /proc、df、loadavg 解析与采样
units.py 体积/时长格式化
app/services/ 业务层
session.py 会话工厂:解析凭据 + 写审计
batch_exec.py 多机并发执行引擎
file_transfer.py SFTP 浏览与传输
app/gui/ PySide6 界面
main_window.py host_tree.py host_dialog.py terminal_view.py
sftp_panel.py batch_panel.py monitor_panel.py audit_panel.py
widgets.py workers.py unlock_dialog.py
resources/style.qss 深色主题
tests/ 128 个单元测试(含离屏 GUI 测试)
6. 测试
.venv\Scripts\python.exe -m unittest discover -s tests -t . -v
覆盖范围:
- 凭据库:创建 / 解锁 / 错误密码 / 篡改检测 / 改主密码 / 锁定后拒绝访问
- 主机清单与审计:CRUD、排序分组、筛选、清空、从工作线程写审计(回归测试)
- SSH 层:三种认证方式的 connect 参数、指纹计算、
sudo -S包装与提权、stdout/stderr 并发读取、超时与连接失败的报错、PTY 与 SFTP 生命周期、主机密钥策略 - VT 模拟器:光标定位/越界裁剪、增删行列、四种擦除、滚动区域、宽字符(CJK)双列、组合字符、备用屏幕、SGR(16 色 / 256 色 / 真彩 / 反显)、OSC 标题、DSR/DA 回包、窗口 resize
- 监控解析:
/proc/statCPU 增量、/proc/meminfo(MemAvailable 优先)、df -Pk过滤伪文件系统、负载、进程数、运行时间 - 批量执行:并发顺序、单机失败隔离、取消、sudo 透传
- 文件传输:列出/权限字符串、原子替换、进度回调、取消清理、覆盖策略
- GUI(
QT_QPA_PLATFORM=offscreen):主窗口与四个面板、主机树勾选级联、会话标签页开关、终端渲染成文本、键位映射、解锁对话框校验逻辑 - 终端剪贴板与跟随:
Ctrl+C有选区时复制 / 无选区时发 SIGINT、Ctrl+Shift+C、Ctrl+Insert、Ctrl+V/Shift+Insert粘贴与 CR 归一化、块分隔符转换行、有选区/拖动/滚上去时冻结重绘且历史不丢、Esc与「跟随输出」恢复、右键菜单项与可用状态 - 端到端(
tests/test_e2e_ssh.py):进程内起一个真实 paramiko SSH 服务端,验证连接+审计、exec、批量并发执行、终端标签页真实 PTY 往返(提示符、命令回显、window-change)、认证失败处理
7. 安全说明与边界
已做到
- 密码/口令只以密文落盘;主密码不存储,
vault.json权限 600 - 可开启严格主机密钥校验,未知密钥直接拒绝(不用默认的 AutoAddPolicy)
- 所有连接、命令、传输、主机变更都有审计记录(
audit.db) - 支持「锁定凭据库」立即清除内存中的密钥
- 批量执行、文件传输都逐条记录到审计日志
明确不做(也不会加)
- 不在目标机安装任何常驻组件、不做反弹连接 / 隐蔽监听
- 不做持久化、进程隐藏、免杀、流量混淆、绕过审计
- 不提供「无凭据也能控制主机」的能力
已知限制
- 终端是 VT100/xterm 的一个实用子集:不支持鼠标事件(SGR mouse)、括号粘贴模式、六键(sixel)图像;
nano/vim/htop/tmux这类程序正常可用 - 终端历史回看本地渲染上限 400 行(模拟器内部保留 2000 行,可整体复制)
- 暂不支持整目录递归下载/上传
sudo提权用登录密码通过sudo -S发送,目标机需要该用户在 sudoers 中(或配置 NOPASSWD)- 未做 SFTP 断点续传
8. 常见问题
“QFontDatabase: Cannot find font directory” — 离屏(offscreen)运行时的无害告警,正常桌面运行不会出现。
装 PySide6 失败 / 提示没有可用轮子 — 说明用的是 32 位 Python。用 C:\Program Files\python 那样的 64 位解释器重建 venv。
终端里中文/框线错位 — 把 app/gui/widgets.py 里 MONO_CANDIDATES 的首选字体换成本机装有的等宽字体(如 Sarasa Mono SC)。
连接被拒 — 先在主机上右键「测试连接」,它会返回 SSH 版本横幅与主机密钥指纹,便于确认目标机和凭据是否正确。

