UniTerminal:在 DSH 右栏里完成 SSH、SFTP 与端口转发

前言

在 DSH 里做远程运维时,常见做法是另开系统终端或独立 SSH 客户端:窗口和 IDE 分离,AI 侧也很难直接利用你已经连上的会话。若希望主机列表、交互式终端、文件传输和本地/远程隧道都收在 DSH 界面里,并且「记住密码」交给操作系统凭据库而不是插件自造加密,社区插件 UniTerminal(npm 包 @winking-r/dsh-uniterminal,维护者 WinKing-R)就是面向这一组合需求的客户端类插件。下面介绍它的定位、能力与安装方式;事实以 GitHub 仓库 README 为准。

这是什么

UniTerminal 挂在 DSH 右侧栏:一个侧边栏标签里可以并存多条会话(顶部会话栏切换;同一主机连两次会显示 #2)。每条会话并列提供 终端(xterm + shell)、文件(SFTP)和 隧道(-L / -R / -D)三视图。

插件自述:密码交给操作系统密码箱保管(Windows 凭据管理器、macOS 钥匙串、Linux Secret Service),自身不实现任何加密;仅当本机没有可用系统密码箱时才回落明文文件,并在界面上说明。当前 README 标注版本 0.2.19,许可证 MIT;运行环境要求 DSH >=0.2.1-rc.2、Node >=20。

社区目录页:skillhub.cn/plugins/WinKing-R/dsh-uniterminal。DSH 生态是「一切皆插件」;该目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

主机与会话

  • 主机:添加 / 编辑 / 删除(二次确认)、分组;可从 ~/.ssh/config 只读导入(不回写);连接前可「测试」连通性;孤儿会话可接管或关闭(接管无需重新输入密码)。
  • 状态:行内状态芯片显示延迟;成功结果 5 分钟后变暗、30 分钟后回到「未测试」;失败保留到下次测试;支持「测试全部」(≤3 并发)与巡检抽屉(依赖远端 Linux 的 /proc、df 等,缺字段则少显示、不阻断连接)。
  • 认证:密码、私钥(路径或粘贴)可同时启用;勾选「记住密码」并保存配置即写入凭据库,不必先连一次;支持跳板链 ProxyJump(各跳暂用同一套凭据)。

终端、文件与隧道

  • 终端:xterm.js,自适应尺寸,断线重连;面板重挂载或页面刷新后,会话与输出通过 sessionStorage 存档尽量不丢。
  • 文件:SFTP 浏览、多选上传(进度与取消)、下载、新建目录、删除。
  • 隧道:本地转发、远程转发、SOCKS5;监听 127.0.0.1;随会话关闭自动回收(README 说明 -R 停止时远端端口可能不会立刻释放,需等会话关闭)。

AI 可调用工具

注册 uniterminal_list_sessions(发现会话)与 uniterminal_exec(在已有会话里执行命令并取 stdout / 退出码)。默认 mode=exec(独立通道,不占用用户正在看的终端);mode=shell 会把命令打进用户终端并留在屏幕上。AI 不能自行建连或提交凭据,只能操作你已打开的会话。不需要时可在插件设置把 agentExec 设为 off。

右栏承载方式

插件双注册并运行时探测:若安装了 DSH-better-sidebar 则优先注册到 betterSidebar;否则回落官方 @deepseek-ai/dsh-client-ui-sidebar-right 的 sidebarRightTabs。没有 better-sidebar 也能用。

安装与启用

前提:DSH >=0.2.1-rc.2、Node >=20。

一条命令(推荐)

DSH CLI 会完成装包并在 profile 中登记:

dsh plugin --profile desktop add @winking-r/dsh-uniterminal@latest

--profile 换成你 ~/.dsh/profiles/ 下实际目录名(常见 desktop 或 web)。装完重启 DSH,右栏应出现 UniTerminal 标签。

README 注明:安装过程若退出码为 1 且打印 Ignored build scripts: cpu-features, ssh2,可能是预期现象——包可能已装好,但自动登记被打断;需确认 dsh.profile.bundles 含 @winking-r/dsh-uniterminal,否则按仓库「故障排查」手动追加。改动宿主代码后须重启 DSH(硬刷新页面不够)。

手动等价步骤

cd ~/.dsh/profiles/desktop
pnpm add @winking-r/dsh-uniterminal

在对应 package.json 的 dsh.profile.bundles 数组追加:

"@winking-r/dsh-uniterminal"

重启 DSH;若右栏未自动出现,用右栏 + 手动添加 UniTerminal 标签。

装完自检(README 建议)

检查 做法 期望
宿主服务 请求 http://127.0.0.1:<DSH 端口>/api/uniterminal/health {"ok":true}
AI 工具 查 ~/.dsh/uniterminal/diag.log 的 agent-tools.registered 含 uniterminal_list_sessions、uniterminal_exec
凭据存储 ~/.dsh/uniterminal/security.json 的 storage 有密码箱时为 keychain 且 degraded 为 false

卸载:先从 dsh.profile.bundles 移除包名,再在 profile 目录 pnpm remove @winking-r/dsh-uniterminal,重启 DSH。主机档案与凭据默认留在 ~/.dsh/uniterminal/。

典型用法

  1. 在 UniTerminal 标签中维护主机(或从 ~/.ssh/config 导入),必要时行内「测试」再「连接」。
  2. 连接后在同一会话切换 终端 / 文件 / 隧道;同一标签可开多条会话,用顶部栏切换。
  3. 需要 AI 在远端执行只读或脚本类命令时,保持会话已连接,由 DSH 内 AI 调用 uniterminal_exec(默认 exec 模式不污染你的交互终端)。

插件设置(节选,见 README 配置表):

键 默认 说明
knownHostsPolicy reject 未知指纹:reject 需显式信任 / trust 自动信任并落盘
connectTimeoutMs 20000 连接超时(毫秒)
agentExec on 关闭则不再注册 exec 工具且相关 API 403
term xterm-256color TERM 类型

用户数据目录 ~/.dsh/uniterminal/:profiles.json 存主机与分组(不含密码);记住的口令在有密码箱时进系统库;无密码箱时可能出现高敏感性的 credentials.json。安全细节见仓库 docs/SECURITY.md。

适用场景与注意

适合:已在用 DSH 做开发与智能体协作、希望 SSH / SFTP / 端口转发与右栏 UI 一体、并愿意把「记住密码」交给 OS 凭据库的用户。

务必知晓:

  • 插件以当前 DSH 进程权限运行;安装与启用前请自行查看源码与 MIT 许可证,评估主机与凭据风险。
  • 不提供终端锁屏;离开座位时已连接会话无额外保护,需自行锁屏或断开。
  • 无系统密码箱或多用户共用机器时,不要依赖「记住密码」的明文回落方案。
  • README 列出的限制还包括:跳板链各跳同一凭据、shell 模式拒绝部分交互式/全屏程序、SFTP 覆盖式上传在个别服务器上的极短窗口等——上线前建议通读 README「已知限制」一节。

结尾

UniTerminal 把 SSH 终端、SFTP 与本地/远程/SOCKS 隧道收进 DSH 右栏,并可选地向 AI 暴露已有会话上的 exec 能力;凭据策略明确依赖操作系统密码箱而非插件内加密。进一步了解与 issue 反馈:

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜