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+CCtrl+Insert
粘贴 Ctrl+VCtrl+Shift+VShift+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/stat CPU 增量、/proc/meminfo(MemAvailable 优先)、df -Pk 过滤伪文件系统、负载、进程数、运行时间
  • 批量执行:并发顺序、单机失败隔离、取消、sudo 透传
  • 文件传输:列出/权限字符串、原子替换、进度回调、取消清理、覆盖策略
  • GUIQT_QPA_PLATFORM=offscreen):主窗口与四个面板、主机树勾选级联、会话标签页开关、终端渲染成文本、键位映射、解锁对话框校验逻辑
  • 终端剪贴板与跟随Ctrl+C 有选区时复制 / 无选区时发 SIGINT、Ctrl+Shift+CCtrl+InsertCtrl+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.pyMONO_CANDIDATES 的首选字体换成本机装有的等宽字体(如 Sarasa Mono SC)。

连接被拒 — 先在主机上右键「测试连接」,它会返回 SSH 版本横幅与主机密钥指纹,便于确认目标机和凭据是否正确。

Linux运维管理器 运维专用