DeepSeek Harness 远程工作区
像使用本地目录一样使用远程服务器
通过 SSH 连接一台主机,选择其中的文件夹,然后直接在其中工作。Agent 会用已有的 全部工具在远端读取、写入、修改、列目录、搜索并执行 shell 命令。连接由所有会话共享,可同时连接 多台服务器,并可在设置 → 插件中一键启用。
它能做什么
- 远程文件夹变成工作区。它像其他工作区一样出现在侧边栏中,在其中打开的会话 直接作用于服务器。
- 全部工具,而非子集。文件读写、字面量编辑、目录列表、
glob/grep以及 shell 都在远端执行。 - 可同时连接多台主机。连接配置是持久化的、由所有会话共享:连接过一次的 服务器在任何地方都可用。
- OpenSSH 或 Tailscale SSH。以你自己的密钥、agent 与
~/.ssh/config为准;tailnet 可额外提供基于身份的访问。
环境要求
- 已安装 dsh —
npm install -g @deepseek-ai/dsh,任意 profile。 - Node 22.19+ 或 24+ — 与 harness 自身要求一致。
- 运行 dsh 的机器上有 OpenSSH 客户端(
ssh -V)。Windows OpenSSH 可作为客户端使用,但没有连接复用。 - 一台 POSIX SSH 服务器(Linux、macOS、BSD)。Windows OpenSSH 服务器会被 明确拒绝并给出提示。
- 推荐使用密钥认证;仅在使用密码时需要
sshpass。 - 可选:服务器上安装
ripgrep,供glob与grep使用。
安装
curl -fsSL https://raw.githubusercontent.com/cmukanisa/dsh-remote-ssh/main/install.sh | sh
或从克隆安装:git clone https://github.com/cmukanisa/dsh-remote-ssh && cd dsh-remote-ssh && node install.mjs
安装即启用;整个过程是一个事务
它先检查全部环境要求,再安装、验证;只要有任何一步不通过,就会回滚到原先的 确切状态——半安装的插件会让 harness 启动一份禁用了内置 provider、却没有注册替代实现的 组合配置。
checking
✓ node ·························· v24.14.0 (the harness requires >= 22.19)
✓ ssh ···································· OpenSSH_10.3p1, LibreSSL 3.3.6
✓ tailscale ················ 1.102.3 — the Tailscale SSH transport is available
✓ harness ················································· /Users/you/.dsh
✓ writable ··································· profiles/plugins accepts writes
✓ modules ················· profiles/node_modules/@deepseek-ai/cordis present
installing
✓ copied ········ dsh-remote-ssh → profiles/plugins/dsh-remote-ssh (8 files)
✓ patched ···································· cordis.patch.yml (8 rows)
✓ enabled ····························· settings.yaml remote-ssh.enabled = true
verifying
✓ files ······················································ 12 files in place
✓ composition ·············································· 8 expected rows
✓ setting ····································· remote-ssh.enabled = true
✓ module ············· registry.js imports and exports RemoteRegistry
──────────────────────────────────────────────────────────────────────────────
Done in 0.1s. Reload the harness page, then workspace "+" → "Serveur distant (SSH)".
| 参数 | 作用 |
|---|---|
--keep-off | 以停用状态安装 — 适用于需要单独审计启用动作的批量部署 |
--enable | 即使之前被停用也强制启用 |
--link | 以符号链接代替复制(开发用) |
--dry-run | 只运行检查并报告将要发生的改动,不写入任何内容 |
--no-color | 纯文本输出(同样遵循 NO_COLOR) |
--uninstall | 移除插件包、组合配置行与该项设置 |
--dsh-home DIR | 指定另一个 harness 主目录 |
使用
- 刷新 harness 页面。
- 点击侧边栏工作区标题中的 + — 或侧边栏底部的 🖥 按钮,两者打开同一对话框。
- 选择 远程服务器(SSH)。
- 点击 + 服务器,填写连接信息:名称、主机、端口、用户、私钥路径或密码。
- 浏览到目标文件夹,点击 使用此文件夹。
该文件夹会作为普通工作区出现。在其中打开的会话直接作用于服务器,该连接配置也对所有其他 会话可用。
界面会跟随浏览器语言:中文、英文或法文。
Tailscale
“通过 Tailscale 连接”包含两件不同的事,插件不会把它们混为一谈。
- 在 tailnet 上使用 OpenSSH — 无需配置。把连接配置指向 MagicDNS 名称或
100.x地址,真正的ssh会经 WireGuard 连接,并以你的密钥与known_hosts为准。 tailscale ssh— 按连接配置选择启用。Tailscale 客户端会包装 系统ssh:解析 MagicDNS、通过tailscaled建立连接,并向协调服务器 校验目标主机密钥。此时访问由 tailnet ACL 而非磁盘上的密钥决定。
连接表单会列出 tailnet 中的节点;当该节点运行 Tailscale SSH 服务端时,一键即可填入 MagicDNS 名称、用户与传输方式。被 Tailscale 标记为离线的节点会在尝试之前指出,而不是表现为 连接超时。
比 harness 活得更久的任务
Agent 循环运行在 harness 进程内,因此关闭它会结束当前回合。能够继续的是命令本身, 关键在于将其分离:插件在服务器上写入一个小型启动脚本,让它在自己的会话中运行,并把输出写到服务端的 日志文件。
- 随时关闭 harness。远端进程会继续运行。
- 回来即可看到。设置 → 插件会列出每个任务的实时状态——运行中、已结束(含退出码) 或已消失——以及最近的输出。
- 想停就停。运行中的条目有停止按钮,会向整个进程组发送信号,子进程一并停止。
无需配置:在远程工作区启动的任务默认分离运行,每个任务在
$DSH_HOME/remotes-sessions.json 中有一条持久记录,由所有会话共享。
更新
重新运行安装器即可。它会重写自己的组合配置块,并在最后一行说明正在运行的 harness 需要哪一种操作:
- 只有浏览器端变化时,刷新页面即可:bundle 由
dsh-client-hmr轮询的字节提供,新 bundle 就是新修订号; - 宿主端(
lib/*.js)变化时——Node 的 ESM loader 会保留启动时加载的模块—— 或者某个包被重命名时,需要重启 harness(dsh web): harness 以启动时读取的包名为键索引客户端模块,并继续用旧 id 提供新 bundle,于是每次加载页面都会 报loaded without registering。安装器会检测这两种情况并明确提示。
node install.mjs # 或再次执行 curl 一行命令
故障排查
| 现象 | 原因与处理 |
|---|---|
does not answer as a POSIX host | 目标是非 POSIX 服务器。请使用 Linux/macOS 主机,或将该机器的 WSL sshd 暴露在独立端口上。 |
Permission denied (publickey) | 先手动执行 ssh <主机>;插件使用同一个客户端、agent 与配置。 |
| 主机密钥发生变化 | 插件会拒绝,这是正确的。确认无误后从 known_hosts 删除旧条目。 |
glob/grep 提示程序不存在 | 在服务器上安装 ripgrep(apt-get install ripgrep、dnf install ripgrep、apk add ripgrep)。 |
| tailnet 节点连接超时 | Tailscale 已标记其离线,连接表单会事先说明。 |
| 某些纯本地工具看不到文件 | 该工具绕过了文件系统抽象层,因此只看到空的本地镜像。请使用工作区文件树。 |
更新后出现 Failed to load plugins … loaded without registering "…dsh-remote-ssh-ui" | 正在运行的 harness 仍持有启动时读取的包标识。重启 dsh web;仅刷新页面不够。 |
需要了解的边界
- 仅支持 POSIX 服务器。远端以 POSIX shell 驱动;Windows OpenSSH 服务器会被 拒绝,而不是半可用。
- 远程命令不受沙箱约束。沙箱是同内核机制;经 SSH 时,账号本身的权限就是 边界,因此远程执行不会报告任何沙箱信息。文件系统层面的限制仍然生效。
glob与grep需要服务器上有 ripgrep。- 没有远程文件监听。目录树在导航时刷新。