最近我做了一个开源桌面工具,叫 TermDock。
它是一个跨平台 SSH + SFTP 桌面客户端,目前主要面向 macOS 和 Windows。项目地址:
https://github.com/gongteng0215/TermDock
我一开始并不是想做“又一个 SSH 客户端”。这个赛道已经有很多成熟工具,比如 Tabby、electerm、Termius、MobaXterm。它们功能很全,生态也更成熟。
TermDock 想解决的是一个更窄的问题:
个人开发者、小团队、外包项目在管理服务器时,经常要在 SSH、SFTP、端口转发、服务器状态检查、失败恢复之间来回切工具。
我希望把这些日常操作做进一个小型服务器工作台里。
为什么想做它?
我平时管理服务器时,经常会遇到这些场景:
- 打开 SSH 终端执行命令
- 用 SFTP 上传或下载部署文件
- 临时开一个端口转发
- 看一下服务器 CPU、内存、磁盘、负载
- 文件传输失败后重新找文件再传
- 担心手滑在生产服务器执行危险命令
这些事情单独看都不复杂,但频繁切工具会打断工作流。
所以 TermDock 的定位不是“大而全终端”,而是:
一个面向个人开发者和小团队的安全 SSH + SFTP 运维工作台。
当前主界面
主界面大概分成几块:
- 中间是多标签 SSH 终端
- 左侧是 SFTP 文件管理
- 右侧是会话、服务器健康和命令历史
- 底部是上传/下载传输队列
整体更像一个服务器工作台,而不是只有一个终端窗口。
核心功能
1. 多标签 SSH 终端
TermDock 支持会话管理、会话分组、搜索、收藏、最近使用排序,以及多标签 SSH 终端。
底层终端渲染使用 xterm.js,SSH 连接使用 ssh2。比较常见的密码和私钥认证都支持。
它适合同时管理多台服务器,也适合在同一台服务器上保留多个工作上下文。
2. SFTP 文件管理和传输队列
SFTP 面板可以浏览远程目录,支持上传、下载、新建、重命名和删除。
传输部分不只是简单上传下载,还支持:
- 上传/下载队列
- 单任务取消和批量取消
- 上传/下载限速
- 冲突策略:覆盖、跳过、重命名
- 传输时间窗口
- 应用重启后的待处理队列恢复
这些能力主要是为批量文件操作准备的。比如部署一批文件时,失败后不用完全从头整理。
3. 危险命令保护
这是我自己比较在意的功能。
很多人应该都有过类似心理阴影:连着生产机时,看到 rm -rf、强制删除、系统目录写入这类命令,总会紧张一下。
TermDock 在命令写入终端前做了一层 guardrail。遇到高风险命令时,会先显示审批栏。
它支持:
- 内置危险命令规则
- 自定义规则
- 按来源启用/禁用,比如键盘输入、粘贴、命令历史、命令片段、启动命令
- 当前标签页或当前会话组的临时授权
这个功能的目标不是“替你判断所有风险”,而是在关键时刻多给一次确认机会。
4. Retry Center
SFTP 传输失败后,TermDock 会保留失败历史,并提供 Retry Center 统一查看和重试。
这个功能适合网络抖动、目录 race、连接断开等情况。失败后可以按会话、方向、原因去筛选,再批量重试。
对我来说,这比“失败后弹个提示,然后你自己重新来一遍”舒服很多。
5. 服务器健康面板
连上服务器后,TermDock 可以在右侧显示基础健康状态,比如:
- CPU
- 内存
- 磁盘
- 网络
- 负载
- 运行时间
- 进程
- 失败服务
它不是 Prometheus / Grafana 这种完整监控系统,也不想替代专业监控。
它更像一个“连上服务器后顺手看一眼”的轻量状态面板,对个人项目、小团队机器、外包交付服务器比较实用。
6. 端口转发管理
TermDock 支持三类 SSH 端口转发:
- Local (
-L) - Remote (
-R) - Dynamic SOCKS5 (
-D)
端口转发可以保存预设,也可以在会话连接后恢复。这样就不用每次手写一长串 ssh -L / ssh -R / ssh -D 命令。
7. Operation Center 和诊断导出
TermDock 还有一个 Operation Center,用来集中查看当前活动:
- 上传/下载
- 删除任务
- 端口转发
- 诊断任务
- 重连动作
另外,应用里也有日志、断连报告和 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 + 服务器健康 + 危险命令保护 + 失败重试” 的方向有没有价值?
- 如果你不会用,主要卡点会是什么?安装、签名、安全信任、功能不够,还是已有工具已经够用?
欢迎拍砖。