- Extend AppLanguage to 7 locales: zh-CN, zh-TW, en, ja, ko, vi, ru - Auto-detect system language via navigator.languages; fallback to English - Add BCP47 locale mapping for date formatting and sorting - Create 50 translation JSON files (5 languages × 10 namespaces, 1137 keys each) - Update language selector with native language names - Extend locale key parity test to cover all 7 languages (70 assertions) - Add VNC/RDP desktop, serial terminal, AI agent, port forwarding, and SFTP features - Add credential encryption, host metrics, session backup crypto, and zmodem bridge - Update Rust backend: desktop services, host metrics, SSH/SFTP enhancements
232 lines
10 KiB
Markdown
232 lines
10 KiB
Markdown
# OpsXShell 专业工具化开发优化推荐
|
||
|
||
> 面向 OpsXShell 2.1.1(Tauri 2 + Rust + React/TS)打磨为专业 SSH / SFTP / VNC / RDP 运维终端的优化清单。
|
||
> 核心目标:**操作简单、人性化、跨平台一致**(Windows / Ubuntu / macOS)。
|
||
> 编写日期:2026-08-11。
|
||
|
||
---
|
||
|
||
## 0. 现状速览
|
||
|
||
| 模块 | 完成度 | 备注 |
|
||
|------|--------|------|
|
||
| SSH 连接 / 认证 / 会话 | ✅ 完整 | 密码、私钥、Agent、ProxyJump(≤8 跳) |
|
||
| 终端(xterm + 多窗格 + 广播 + Zmodem) | ✅ 完整 | 含断线重连、快照恢复 |
|
||
| SFTP 文件管理 | 🟡 基本完整 | 目录递归批量、传输冲突策略缺失 |
|
||
| 端口转发(Local/Remote/Dynamic) | ✅ 完整 | 实时可视化待补 |
|
||
| VNC | 🟡 基本可用 | **Tight JPEG 解码缺失**,剪贴板 Latin-1 |
|
||
| RDP(NLA / 剪贴板 / 文件共享) | ✅ 完整 | 多屏 / 双向文件待补 |
|
||
| 跨平台(Win / Mac / Linux) | ✅ 完整 | 签名公证 / 自动更新待补 |
|
||
| 主题 / i18n / 命令面板 | ✅ 完整 | — |
|
||
|
||
---
|
||
|
||
## 1. P0 — 立即修复(阻断性 / 数据正确性)
|
||
|
||
### 1.1 ⚠️ 修复凭据目录路径 typo(最高优先)
|
||
|
||
- **位置**:`src-tauri/src/services/credential_store.rs:3`
|
||
- **现状**:`const KEY_DIRECTORY: &str = ".opsxshsell";`(多了一个 `s`)
|
||
- **影响**:
|
||
- 主密钥实际写入 `~/.opsxshsell/master.key`,与产品名 `OpsXShell`、文档约定 `~/.opsxshell/` 不一致。
|
||
- 若后续修正常量但不加迁移,**所有已加密的会话密码 / 私钥口令 / 代理密码将无法解密**,用户数据丢失。
|
||
- **修复方案**:
|
||
1. 改常量为 `.opsxshell`。
|
||
2. 启动时检测旧目录 `~/.opsxshsell/` 是否存在;存在则原子迁移(移动 master.key 与所有加密文件到新目录,校验权限 0700/0600)。
|
||
3. 迁移成功后保留旧目录备份 `.opsxshsell.bak`,记录迁移日志,避免误删。
|
||
4. 加单元测试覆盖「旧目录存在 → 迁移 → 可解密」链路。
|
||
|
||
### 1.2 🔴 补齐 VNC Tight JPEG 解码
|
||
|
||
- **位置**:`src-tauri/src/services/desktop/vnc_engine.rs:312`
|
||
- **现状**:`VncEvent::JpegImage(rect, _data)` 直接丢弃,依赖下次 FullRefresh 用 Raw/Zrle 重绘脏区。
|
||
- **影响**:TigerVNC / TightVNC / RealVNC 默认偏好 Tight+JPEG 编码;当前会表现为**画面延迟、带宽飙升、拖影**,达不到专业工具水准。
|
||
- **方案**:
|
||
1. 引入 `turbojpeg`(或 `mozjpeg-sys`)crate。
|
||
2. 将 JPEG bytes 解码为 RGBA,复用现有 `extract_rect` / `putImageData` 路径写入 framebuffer。
|
||
3. 解码失败时回退到当前的 raw refresh 兜底,保证可用性。
|
||
4. 验收:连接 TightVNC 桌面播放视频,FPS 与带宽对比应明显改善。
|
||
|
||
### 1.3 🔴 SFTP 目录递归上传 / 下载
|
||
|
||
- **现状**:UI 层(`src/components/sftp/`)以单文件操作为主,拖拽整个目录缺少递归封装。
|
||
- **影响**:专业运维高频场景(部署目录、日志归档)当前体验不达标。
|
||
- **方案**:
|
||
1. Rust 侧新增 `sftp_upload_dir(local_dir, remote_dir)` / `sftp_download_dir(remote_dir, local_dir)`,递归遍历 + `mkdir -p` + 保留 mtime/权限。
|
||
2. 单条传输队列项可折叠显示子任务进度(已完成 N / 总 M 文件)。
|
||
3. 失败任务支持「重试剩余」而非整体回滚。
|
||
|
||
### 1.4 错误信息人性化
|
||
|
||
- **现状**:前端常直接透传 Rust 错误字符串(如 `Io: Connection refused`)。
|
||
- **方案**:建立错误码 → 人话映射表:
|
||
- `HostKeyChanged` → 「⚠️ 主机密钥已变更。若你刚刚重装系统这是正常的;若不是,可能存在中间人攻击。点击『更新并连接』或『拒绝』。」
|
||
- `AuthFailed` → 「认证失败。请检查用户名 / 密码,或私钥口令是否正确。」
|
||
- `ConnTimeout` → 「连接超时。请确认主机可达、防火墙已放行 22 端口。」
|
||
- 每条提供「为什么 + 怎么办」两部分。
|
||
|
||
---
|
||
|
||
## 2. P1 — 专业工具基线(近期)
|
||
|
||
### 2.1 传输队列增强
|
||
|
||
- **冲突策略对话框**:目标已存在时弹出 — 覆盖 / 跳过 / 重命名 / 断点续传(已有 `.opsx-part` 机制,需暴露到 UI)。
|
||
- **全局速率限制**:可配上限(如 10 MiB/s),避免占满办公带宽。
|
||
- **并发控制**:同时活跃 3~5 个传输,其余排队。
|
||
- **失败自动重试**:N 次指数退避 + 手动「重试」按钮。
|
||
- **单位规范**:统一使用 `MiB/s`、`KiB/s`(运维语境,非 SI 单位)。
|
||
|
||
### 2.2 端口转发实时可视化
|
||
|
||
- 每条运行中规则显示:
|
||
- ✓ 活跃连接数
|
||
- ↑↓ 累计字节 / 实时速率
|
||
- 远端 ping 延迟条
|
||
- 失败时红点 + 错误原因 tooltip
|
||
- 规则修改前强制停止 Listener(`AGENTS.md` 已规定,UI 需显式引导)。
|
||
|
||
### 2.3 RDP 文件共享双向化
|
||
|
||
- **现状**:`rdpdr_fs.rs` 单文件 50MB 上限,仅挂载本地 `Downloads`。
|
||
- **方案**:
|
||
1. 上限可配(默认提升到 200MB)。
|
||
2. 本地→远端上传进度条(已有 `upload_file` 命令,补 UI 进度)。
|
||
3. 可选挂载任意本地目录(而非固定 Downloads)。
|
||
4. 远端「此电脑」显示中文友好名。
|
||
|
||
### 2.4 三平台签名 / 公证 / 自动更新
|
||
|
||
| 平台 | 必做项 |
|
||
|------|--------|
|
||
| macOS | Apple Developer ID 签名 + 公证 + Hardened Runtime + Notarization staple |
|
||
| Windows | EV / OV 代码签名证书 + SmartScreen 信誉积累 |
|
||
| Linux | AppImage / deb / rpm,glibc 版本对齐 Ubuntu 22.04 LTS |
|
||
|
||
- 接入 Tauri Updater,签名 manifest,CI 自动发布到 GitHub Releases。
|
||
- **`AGENTS.md` 已规定**:无签名凭据不得宣称完成签名 / 公证。规划时需先取得凭据。
|
||
|
||
### 2.5 VNC 剪贴板 UTF-8 化
|
||
|
||
- **现状**:`vnc_engine.rs` CutText 走 Latin-1 降级,**中文 / 日文必乱码**。
|
||
- **方案**:升级到 UTF-8 编解码;远端不支持 UTF-8 时回退 Latin-1 并提示用户。
|
||
|
||
---
|
||
|
||
## 3. P2 — 体验跃升(中期)
|
||
|
||
### 3.1 终端效率链路
|
||
|
||
- **Cmd/Ctrl + 点击文件路径** → 直接唤起 RemoteTextEditor 远程编辑(已存在组件,打通调用链)。
|
||
- **选中即复制 + 右键粘贴**:作为可选开关(对齐 iTerm2 / Windows Terminal)。
|
||
- **WebLinks 点击二次确认**:防止 ANSI 注入钓鱼链接。
|
||
- **SSH Agent 转发开关**:`auth.rs` 已支持 Agent 认证,补 ForwardAgent 请求开关。
|
||
- **tmux / screen 集成**:检测远端已 attach 会话时提示恢复。
|
||
|
||
### 3.2 RDP 多屏 / 全屏
|
||
|
||
- 全屏模式 + 远程显示器选择(`DesktopSessionView` 当前单 canvas)。
|
||
- 动态 DesktopResize PDU:窗口缩放时同步调整远端分辨率。
|
||
|
||
### 3.3 命令面板扩展
|
||
|
||
- `CommandPalette` 已存在,扩展 fuzzy 索引:
|
||
- 会话 / 文件 / 隧道规则 / 最近主机 / 快捷动作。
|
||
- 快捷键:`Cmd+K`(macOS)/ `Ctrl+K`(Win/Linux)全局唤起。
|
||
|
||
### 3.4 首次启动引导
|
||
|
||
- `WelcomeView` 3 步引导:添加主机 → SSH 连接 → 文件传输。
|
||
- 降低运维新手门槛,体现"操作简单"产品定位。
|
||
|
||
### 3.5 SFTP 体验细节
|
||
|
||
- 文件覆盖前差异预览:双方 size / mtime / SHA256。
|
||
- 多选批量 chmod(`ChmodDialog` 已支持单文件)。
|
||
- 符号链接:`list` 是否返回 symlink target 需确认,UI 区分展示。
|
||
|
||
---
|
||
|
||
## 4. P3 — 差异化竞争力(加分项)
|
||
|
||
| 项 | 说明 |
|
||
|----|------|
|
||
| VNC VeNCrypt / TLS | 支持加密 VNC,公网可用 |
|
||
| RDP 远程音频重定向 | `rdpsnd` 依赖已引入,补 UI 开关 |
|
||
| RDP 打印机重定向 | 按需评估 |
|
||
| 本地终端 + 串口 | 已实现,打磨 Tab 体验即可 |
|
||
| AI 运维助手 | 已实现多 provider,可对接当前 SSH 会话上下文 |
|
||
| 会话分组 / 标签 / 着色 | 大量主机时的组织能力 |
|
||
| 配置导入 | 支持 Termius / Royal TS / .ssh/config 导入,降低迁移成本 |
|
||
|
||
---
|
||
|
||
## 5. 跨平台验收清单
|
||
|
||
> 平台安装包必须在目标系统**实机验收**(`AGENTS.md` 规定)。
|
||
|
||
### Windows
|
||
- [ ] ConPTY(Win10 1903+)下中文 / IME / 彩色正常
|
||
- [ ] Ctrl 组合键、Alt 键映射正确
|
||
- [ ] 右键粘贴、选中即复制开关生效
|
||
- [ ] SFTP 本地面板路径分隔符 `\` vs `/` 一致
|
||
- [ ] Deep Link `ssh://` / `opsxshell://` 注册表写入与卸载清理
|
||
- [ ] 代码签名 + SmartScreen 验证
|
||
|
||
### Ubuntu / Linux
|
||
- [ ] Ubuntu 22.04 / 24.04 glibc 兼容
|
||
- [ ] Wayland 下 IME、HiDPI 缩放
|
||
- [ ] deb / rpm / AppImage 三种包格式
|
||
- [ ] AppImage 可执行权限提示友好
|
||
- [ ] 系统托盘(可选)
|
||
|
||
### macOS
|
||
- [ ] Apple Developer ID 签名 + 公证
|
||
- [ ] Gatekeeper 直接打开(无需右键绕过)
|
||
- [ ] retina HiDPI 终端清晰
|
||
- [ ] 触控板手势(双指缩放映射到 VNC/RDP 远端)
|
||
- [ ] DMG 安装体验
|
||
|
||
---
|
||
|
||
## 6. 推荐实施顺序
|
||
|
||
```
|
||
第 1 周:P0
|
||
├─ 凭据目录 typo 修复 + 迁移逻辑(含测试)
|
||
├─ VNC Tight JPEG 解码
|
||
├─ SFTP 目录递归
|
||
└─ 错误信息人性化映射表
|
||
|
||
第 2-3 周:P1
|
||
├─ 传输队列冲突策略 + 限速 + 并发
|
||
├─ 端口转发实时可视化
|
||
├─ VNC 剪贴板 UTF-8
|
||
└─ RDP 文件共享双向化
|
||
|
||
第 4 周+:P1 收尾
|
||
├─ 取得签名凭据 → 三平台签名公证
|
||
└─ 自动更新通道搭建
|
||
|
||
后续:P2 / P3 按用户反馈迭代
|
||
```
|
||
|
||
---
|
||
|
||
## 7. 关键约束(来自 AGENTS.md,开发时必须遵守)
|
||
|
||
- 未由 Rust 后端实现的能力不能在界面中显示为可用。
|
||
- 会话密码 / 私钥口令 / 代理密码必须由 Rust 加密后落盘。
|
||
- 不保存终端命令历史;批量命令结果仅保留在当前窗口。
|
||
- 主机密钥使用 `~/.ssh/known_hosts` 校验,显式拒绝 TOFU。
|
||
- 主密钥位于 `~/.opsxshell/master.key`,Unix 目录权限 0700、文件权限 0600。
|
||
- 端口转发规则可持久化,运行中状态不得持久化;停止操作必须关闭真实原生 Listener。
|
||
- SFTP read/write 不得作为 upload/download 别名;本地 / 远程路径不得含糊调用。
|
||
- 大模型新配置必须先用临时凭据完成真实测试,不得提前写 settings 或 secrets。
|
||
- `ssh://` 禁止携带密码或静默直连,必须经原生有界队列确认。
|
||
- 平台安装包必须在目标系统实机验收;无签名凭据不得宣称完成签名 / 公证 / 自动更新。
|
||
|
||
---
|
||
|
||
*本文档基于 2026-08-11 代码库现状编写,后续迭代请同步更新。*
|