我用 Electron + React 做了一个跨平台 SSH + SFTP 桌面客户端

0 阅读6分钟

最近我做了一个开源桌面工具,叫 TermDock

它是一个跨平台 SSH + SFTP 桌面客户端,目前主要面向 macOS 和 Windows。项目地址:

https://github.com/gongteng0215/TermDock

我一开始并不是想做“又一个 SSH 客户端”。这个赛道已经有很多成熟工具,比如 Tabby、electerm、Termius、MobaXterm。它们功能很全,生态也更成熟。

TermDock 想解决的是一个更窄的问题:

个人开发者、小团队、外包项目在管理服务器时,经常要在 SSH、SFTP、端口转发、服务器状态检查、失败恢复之间来回切工具。

我希望把这些日常操作做进一个小型服务器工作台里。

为什么想做它?

我平时管理服务器时,经常会遇到这些场景:

  • 打开 SSH 终端执行命令
  • 用 SFTP 上传或下载部署文件
  • 临时开一个端口转发
  • 看一下服务器 CPU、内存、磁盘、负载
  • 文件传输失败后重新找文件再传
  • 担心手滑在生产服务器执行危险命令

这些事情单独看都不复杂,但频繁切工具会打断工作流。

所以 TermDock 的定位不是“大而全终端”,而是:

一个面向个人开发者和小团队的安全 SSH + SFTP 运维工作台。

当前主界面

terminal-workspace.png

主界面大概分成几块:

  • 中间是多标签 SSH 终端
  • 左侧是 SFTP 文件管理
  • 右侧是会话、服务器健康和命令历史
  • 底部是上传/下载传输队列

整体更像一个服务器工作台,而不是只有一个终端窗口。

核心功能

1. 多标签 SSH 终端

TermDock 支持会话管理、会话分组、搜索、收藏、最近使用排序,以及多标签 SSH 终端。

底层终端渲染使用 xterm.js,SSH 连接使用 ssh2。比较常见的密码和私钥认证都支持。

它适合同时管理多台服务器,也适合在同一台服务器上保留多个工作上下文。

2. SFTP 文件管理和传输队列

SFTP 面板可以浏览远程目录,支持上传、下载、新建、重命名和删除。

sftp-file-browser.png

传输部分不只是简单上传下载,还支持:

  • 上传/下载队列
  • 单任务取消和批量取消
  • 上传/下载限速
  • 冲突策略:覆盖、跳过、重命名
  • 传输时间窗口
  • 应用重启后的待处理队列恢复

这些能力主要是为批量文件操作准备的。比如部署一批文件时,失败后不用完全从头整理。

3. 危险命令保护

这是我自己比较在意的功能。

很多人应该都有过类似心理阴影:连着生产机时,看到 rm -rf、强制删除、系统目录写入这类命令,总会紧张一下。

TermDock 在命令写入终端前做了一层 guardrail。遇到高风险命令时,会先显示审批栏。

dangerous-command-guardrails.png

它支持:

  • 内置危险命令规则
  • 自定义规则
  • 按来源启用/禁用,比如键盘输入、粘贴、命令历史、命令片段、启动命令
  • 当前标签页或当前会话组的临时授权

这个功能的目标不是“替你判断所有风险”,而是在关键时刻多给一次确认机会。

4. Retry Center

SFTP 传输失败后,TermDock 会保留失败历史,并提供 Retry Center 统一查看和重试。

retry-center.png

这个功能适合网络抖动、目录 race、连接断开等情况。失败后可以按会话、方向、原因去筛选,再批量重试。

对我来说,这比“失败后弹个提示,然后你自己重新来一遍”舒服很多。

5. 服务器健康面板

连上服务器后,TermDock 可以在右侧显示基础健康状态,比如:

  • CPU
  • 内存
  • 磁盘
  • 网络
  • 负载
  • 运行时间
  • 进程
  • 失败服务

它不是 Prometheus / Grafana 这种完整监控系统,也不想替代专业监控。

它更像一个“连上服务器后顺手看一眼”的轻量状态面板,对个人项目、小团队机器、外包交付服务器比较实用。

6. 端口转发管理

TermDock 支持三类 SSH 端口转发:

  • Local (-L)
  • Remote (-R)
  • Dynamic SOCKS5 (-D)

port-forwarding-settings.png

端口转发可以保存预设,也可以在会话连接后恢复。这样就不用每次手写一长串 ssh -L / ssh -R / ssh -D 命令。

7. Operation Center 和诊断导出

TermDock 还有一个 Operation Center,用来集中查看当前活动:

  • 上传/下载
  • 删除任务
  • 端口转发
  • 诊断任务
  • 重连动作

operation-center.png

另外,应用里也有日志、断连报告和 bug report 导出。因为 SSH/SFTP 工具一旦出问题,最怕的是“我不知道发生了什么”。所以诊断信息对后续排查很重要。

技术栈

项目主要使用:

  • Electron
  • React
  • TypeScript
  • Vite
  • xterm.js
  • ssh2
  • Playwright / Electron smoke test

大致结构:

src/main       Electron 主进程、IPC、存储
src/renderer   React UI
src/shared     共享类型和契约

Electron 主进程主要处理 SSH/SFTP、文件系统、日志、打包相关能力;React 负责桌面 UI;共享类型放在 src/shared

测试和验证

为了避免每次改 UI 都靠手点,我做了一个 UI smoke 测试。

它会启动一个本地内置 SSH/SFTP fixture,不需要真实外部服务器,就能覆盖主要流程:

  • SSH 连接
  • SFTP 浏览、上传、下载、删除
  • 批量上传恢复
  • 远程文件打开和保存冲突
  • 端口转发
  • 设置页
  • 危险命令保护
  • 命令历史
  • Retry Center
  • Operation Center
  • 中文界面检查
  • 断连报告

当前 master 上最近一次验证:

pnpm run typecheck
pnpm run build
pnpm run smoke:ui
​
PASS 47 / FAIL 0 / SKIP 0

这类桌面应用,如果没有自动化 smoke,后期功能越多越难维护。

和现有 SSH 客户端有什么区别?

如果你需要非常成熟、协议特别全、插件生态强的工具,Tabby、electerm、Termius、MobaXterm 都是很好的选择。

TermDock 的方向更窄:

不是“我也能连 SSH”,而是“连服务器、传文件、看状态、开端口转发、避免危险命令、失败后能恢复”。

所以它更适合这些人:

  • 个人开发者
  • 小团队
  • 经常维护几台服务器的人
  • 外包项目里经常要交付和部署的人
  • 想要一个本地优先服务器工作台的人

安全和本地优先

SSH/SFTP 工具涉及服务器账号和密钥,所以这块需要讲清楚。

TermDock 是本地优先桌面应用:

  • 不需要云账号
  • 会话数据保存在本地
  • 凭据会尽量通过系统安全存储保存
  • 会话和分组导出不会包含解密后的凭据
  • 诊断包在本地生成,分享前可以自行检查

项目里也补了 SECURITY.md,专门说明安全边界和当前限制。

当前限制

项目还比较早期,目前有一些限制:

  • 暂无应用内自动更新
  • 数据持久化仍基于 JSON,后面计划迁移 SQLite
  • 公开可信签名 / notarization 证据仍在完善
  • Dynamic 转发目前是 SOCKS5 no-auth 基线
  • 还需要更多真实用户反馈

项目地址

GitHub:

https://github.com/gongteng0215/TermDock

如果你平时也经常管理服务器、传文件、开端口转发,欢迎试用,也欢迎提 issue。

我现在最想听到的反馈是:

  • 你平时主要用什么 SSH/SFTP 客户端?
  • TermDock 这种 “SSH + SFTP + 服务器健康 + 危险命令保护 + 失败重试” 的方向有没有价值?
  • 如果你不会用,主要卡点会是什么?安装、签名、安全信任、功能不够,还是已有工具已经够用?

欢迎拍砖。