dsh-remote-ssh:在 DSH 侧栏里把远端机器当本地工作区用

前言

在 DSH(DeepSeek Harness)里做智能体开发时,工具和上下文多半落在本机工作区;真正要改的服务、跑命令的环境往往在另一台 SSH 可达的机器上。常见做法是再开一个终端和 SFTP 客户端,或在编辑器里装 Remote SSH,但那些界面与 DSH 的会话、better-sidebar 并不天然连在一起。

下面介绍社区插件 dsh-remote-ssh(维护者 LinHao100076,MIT 许可)。它在 DSH 右侧边栏(或与 dsh-better-sidebar 联动的「远程 SSH」标签页)里提供远端文件树、终端、按方向配置的编辑同步、SFTP 传输,以及本地 -L、动态 -D、反向 -R 转发与多跳跳板链路。README 将当前重点版本写为 0.7.3(无密钥首次建连、堡垒机多跳、密码与 2FA 等);仓库 package.json 中版本号为 0.7.4,安装时以你拿到的发布包为准。

插件在 SkillHub 分类为「客户端」,GitHub 星标约 3。目录页:https://www.skillhub.cn/plugins/LinHao100076/dsh-remote-ssh;源码与说明:https://github.com/LinHao100076/dsh-remote-ssh。

这是什么

一句话定位:这不是独立的通用 SSH 客户端,而是「本地 DSH 工作区旁挂一条远端通道」——文件、终端、同步和转发都收在同一个 Workspace 面板里(主机头 + 文件 / 终端 / 同步 / 转发 / 设置 + 状态栏)。

设计文档(docs/design.md)里的核心判断是:agent 与 better-sidebar 的执行世界在本地,因此 v0.x 走「本地镜像 + 旁挂远端」,而不是把整个 harness 搬到远端。主机配置与映射状态落在插件自己的 ~/.dsh/storages/dsh-remote-ssh/state.json;密码和口令不落盘,只在浏览器内存里、连接时现取。

核心功能

入口与界面

两种入口互斥,面板是同一套组件:

装了什么 出现在哪 怎么打开
有 dsh-better-sidebar better-sidebar 侧栏里名为「远程 SSH」的一个标签页 侧栏点「远程 SSH」
没有 / 停用了 better-sidebar DSH 自带右侧边栏 会话头部右上角服务器图标

界面宽度跟随右侧栏;可先本地打开 ui/prototype.html 对照布局(转发视图晚于原型,改 UI 以 client/forward-view.jsx 为准)。

文件与传输

  • 侧边栏浏览远端目录:单击展开、双击进入;面包屑与「上传位置」表示当前目录;回到文件页会刷新,页面可见时每约 4 秒刷新当前目录与已展开子目录。
  • 上传按 256 KB 分块,避免大块文件塞进 JSON;支持取消(发布阶段不可取消);空闲 15 分钟任务自动清理。
  • 下载可填本机绝对路径(含文件名),也可「下载到映射目录」;此处的「本地」是 DSH 宿主所在机器(桌面版即当前电脑,远程 Web 部署则是跑 DSH 的服务器)。
  • 0.5.0 起支持 SFTP 断点续传;0.7.2 起加强覆盖与自动同步边界(不完整传输、源变化时保留目标;OpenSSH 原子 rename 等,详见 CHANGELOG)。

远端搜索

放大镜默认在当前目录及子目录按文件名包含关键词查找;可切到「文件内容」模式,在远端执行 rg(无则 grep -r),不把整库拉到本地索引。内容模式支持 smart-case 与有限正则;结果上限 200 条并在远端截断。

终端与 tmux

远端有 tmux 时执行 tmux new -A -s dsh-<host>,刷新或断线后可接回同一会话;没有 tmux 则用普通 shell,并提示刷新后会话进程会结束。新建终端标签对应独立 tmux 会话。

同步(镜像编辑)

「同步」标签页按映射配置方向(本地 ↔ 远端)做文件镜像与 watcher;与 agent 在本地改动上传、远端文件下载等流程配合。相对映射路径按会话目录解析;下载不能越过本地映射目录。具体冲突策略与 0.7.2 的变更见 README 与 CHANGELOG。

端口转发与跳板

方式 监听端 典型用途
本地 -L DSH 宿主 经 SSH 主机访问其可达的内网服务(如 B:22、数据库、Web)
动态 -D 宿主 SOCKS5 支持 SOCKS5 的客户端访问多个内网目标
反向 -R SSH 主机侧 让服务器访问宿主上的服务
跳板链路(推荐连内网 B) 无额外固定监听 在主机 B 的设置里串起 A→B,插件完成 本机 → A → B,文件与终端属于 B

经 A 连 B 时:跳板链路会替你完成到 B 的 SSH 登录;仅开 -L 到 B 的 22 端口只提供 TCP 隧道,仍要再用 B 的地址与凭据建主机,且 A 的连接须保持运行。远程 Web 部署时,表中的「宿主」指运行 DSH 的服务器,不是打开浏览器的电脑。

0.6.0 起补充 SOCKS5 动态转发与 -R;0.7.0 起支持密码 / keyboard-interactive(2FA)与多跳跳板;0.7.0 起强调无密钥也能首次建连。

认证与依赖

Node ≥ 20(CI 在 20 / 22 / 24 上跑测试);宿主端 lib/server.mjs 将 ssh2、ws、chokidar 等打进 bundle,发布包无运行期 npm 依赖(0.3.1 起)。客户端通过 @deepseek-ai/dsh-client-ui-slots 等注入 Web 侧栏。

安装与启用

不要使用裸包名 dsh plugin add dsh-remote-ssh:npm 上存在同名但归属不同的包,会占同一 node_modules/dsh-remote-ssh 目录。安装须用 GitHub Release 的 tgz 完整路径或按仓库说明取用;认准仓库 LinHao100076/dsh-remote-ssh。

推荐用发布包安装(DSH 会写入 profile 的 dsh.profile.bundles):

npm run pack:rel     # 生成 dist/dsh-remote-ssh-<版本>.tgz
dsh plugin --profile <profile> add -w "/path/to/plugin.tgz"

-w 不能省略:profile 含 pnpm-workspace.yaml 时,不带 -w 可能报 ERR_PNPM_ADDING_TO_ROOT。

不要解压 tgz 后把目录当路径装进去(pnpm 可能写成 link:,历史上会导致宿主端 import 缺依赖);当前发布包已把依赖打进 lib/server.mjs,用 tgz 路径即可。

CLI 启动示例(app 参数直接跟在后面,不要写 web):

dsh --profile <name> --no-open --port 4987

desktop profile 由桌面应用独占,CLI 会拒绝;应在应用内插件页安装,或手工改 package.json 的 bundles 与 cordis.patch.yml 后重启。桌面版升级插件后请完全退出再启动,只关侧栏可能仍加载旧客户端代码。

开发期也可仅在 cordis.patch.yml 插入插件 id(需已构建 lib/client.js),见 README「装到 profile 里」一节。

典型用法

1. 第一次连上主机

  1. 打开「远程 SSH」面板,新建连接,填写地址、端口、用户与认证(密钥、密码或 2FA)。
  2. 若目标在内网,在「跳板链路」里按顺序添加堡垒机卡片(支持多跳;~/.ssh/config 的 ProxyJump 会展开为多跳)。
  3. 连接成功后,在「文件」页浏览、预览、上传或下载;在「终端」页执行命令。

2. 经堡垒机访问内网 B(推荐跳板)

  1. 新建主机 B:填 B 内网地址、端口、用户与 B 的认证。
  2. 在 B 的跳板链路中添加 A,填 A 的 SSH 地址与认证。
  3. 连接后文件树与终端即 B 的环境,无需先手动配 -L 再二次建连。

若必须用转发:先在 A 上添加本地 -L 监听 127.0.0.1:2222,目标为 A 能访问的 B:22;再建主机 B,地址 127.0.0.1、端口 2222,用户与认证仍填 B 的,并保持 A 连接与转发运行。

3. 搜索与编辑

  1. 在文件视图选目录,用搜索默认可查文件名;切「文件内容」则在远端 rg/grep。
  2. 在「同步」页配置映射方向,让本地 agent 改动按规则上传到远端或拉取远端文件;注意映射目录边界与冲突说明(见 0.7.2 README 段落)。

4. 端口转发

在「转发」页为已连接主机添加 -L、-D 或 -R 规则,在宿主(或 Web 部署时的 DSH 服务器)上监听,把流量导向 SSH 对端可达的服务。

适用场景与注意

适合谁:已经在用 DSH 做本地智能体开发,需要频繁在侧边栏看远端目录、开 shell、同步一小段映射目录,或临时做 SSH 隧道,又不想在 DSH 外再维护一套 Remote 工具链的人。

权限与安全:插件在当前 DSH 宿主进程权限下执行 SSH、读写本地映射路径与转发监听;安装前应阅读源码、SECURITY.md 与 MIT 许可证,确认凭据存储模型是否符合你的环境。社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系,插件属社区贡献。

其他注意:

  • 与 dsh-better-sidebar 联动时侧栏更集中;无 better-sidebar 时用原生右侧栏入口即可。
  • 远端 Web 部署时,下载目标路径、-L/-D 监听端都在 DSH 服务器上,不是浏览器所在电脑。
  • 上传中断或异常可能留下远端 .dsh-tmp-* 临时文件;大文件上传请留意分块与取消行为。

结尾

经过上面的步骤,可以把 dsh-remote-ssh 理解成:在 DSH 里给远端机器做一块固定的「影子工作区」——文件、终端、定向同步和三种转发收在同一面板,并支持多跳与无密钥首次建连。细节与版本差异以仓库 README、CHANGELOG 和 ROADMAP 为准。

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

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

小夜