前言¶
DeepSeek Harness(简称 DSH)是 DeepSeek 开源的智能体运行时,核心理念是「一切皆插件」:模型、工具、会话、沙箱、文件系统和界面都可以挂载、替换。仓库地址是 https://github.com/deepseek-ai/deepseek-harness 。社区里有一份独立维护的插件目录 https://deepseek-harness-plugin.com/zh-CN/plugins/ ,它不是 DeepSeek / 幻方的官方应用商店,收录的条目需要对照 GitHub 和 npm 再核一遍。
DSH 的 Web 界面刻意只监听 127.0.0.1,CLI 也会拒绝 --host 0.0.0.0。本地 harness 很安全,但日常代码经常不在本机:构建机、开发容器、实验室服务器上才有完整工程。这时常见做法是另开一个 SSH 终端,或者自己维护同步脚本。dsh-remote 走的是另一条路:由你主动连出到自己维护的机器,选一个远程目录当工作区,再让 Agent 用一组 rw_* 工具在那边列文件、读代码、跑命令。
当前 npm 版本为:0.5.7(2026-08-16 更新)。GitHub 仓库 https://github.com/flymysql/dsh-remote 在 2026-08-17 核实为 17 star,MIT 许可证,主要语言 JavaScript。社区目录把它分在「工具与能力」。
这是什么¶
dsh-remote 是 flymysql 维护的 DeepSeek Harness 远程工作助手。它做三件事:用 SSH(私钥或密码)连上远程主机;选出一个远程目录作为工作区;用 rw_* 工具操作这个目录,同时通过 SFTP 把它镜像成本地真实目录,让 DSH 原生工作区可以收养。
插件声明为普通 bundle,不改 dsh-workspace 核心。package.json 里的客户端注入目标是 @deepseek-ai/dsh-client-runtime 和 @deepseek-ai/dsh-client-ui-workspace,platform 为 web,对等依赖对齐 DeepSeek Harness ^0.1.0-rc.6。也就是说,它是给 Web 界面用的远程工作区插件,不是把 harness 整机搬到远端去跑。
核心功能¶
仓库 README 和当前 lib/index.js 对得上的能力如下。
1、多机 SSH 登记。设置页有「远程工作区」:可以增删改多台主机(host / port / user,认证用私钥或密码),并设当前机。密码只存在本机,界面不回显。保存前可以用「测试连接」验证 host、用户和凭据是否可用。
2、双 tab 工作区选择器。它填充原生「Add workspace / 选择工作区」流程,居中弹窗,默认落在「本机」:
- 本机:走 host 端系统文件夹对话框,或直接输入本地路径,得到普通 DSH 本地工作区,和远程工作区可以共存。
- 远程:先选机器,路径框预填 / 并实时补全目录;点选一层立刻列出下一级,类似系统文件选择或 VS Code。另有「浏览…」浮层,选中只回填输入框,不直接提交,复核后再点「设为远程工作区」。
3、本地镜像 + 双向 SFTP。确认远程目录后,插件会在本机创建真实镜像目录(README 写在 ~/.dsh/remote-workspaces/ 下),fs.realpath 能通过,harness 把它当普通工作区收养。rw_sync 从远程拉到镜像,rw_push 把镜像改动推回去。当前实现里,rw_sync 默认深度 5、最多 500 个文件(深度上限 8,文件上限 2000);rw_push 同样有文件数上限。大仓库不要默认成「整库无损同步」。
4、给模型用的 rw_* 工具,当前注册这些名字:
| 工具 | 作用 |
|---|---|
rw_info |
查看当前主机、工作区和连通状态 |
rw_connect |
按 host / user / 端口 / 凭据建立 SSH |
rw_pick_workspace |
把某个绝对路径设为远程工作根,并创建本地镜像 |
rw_list_dir |
列出远程目录(省略 path 时列当前工作区) |
rw_read_file |
按行号分页读远程文本文件 |
rw_write_file |
直接创建或覆盖远程文件,默认补齐父目录 |
rw_exec |
在远程执行 shell 命令 |
rw_sync |
远程 → 本地镜像 |
rw_push |
本地镜像 → 远程 |
rw_disconnect |
关闭当前 SSH 连接 |
单个文件改动不必先改镜像再 rw_push:rw_write_file 会走 SFTP 直接写远端。当前 user@host:/path 还会注入系统提示,让 Agent 知道工作根。源码里还注册了斜杠命令 /remote,用来查看连接状态。
5、凭据不再偷偷读默认私钥。CHANGELOG 0.5.5 写明:不再隐式读取 ~/.ssh/id_rsa。当前源码也一致——privateKeyPath 只有显式给出才会用;既没有密码、也没有私钥路径时,连接会失败并提示 no credentials: set a password or a privateKeyPath to connect。README 配置表里仍写着「空则默认 ~/.ssh/id_rsa」,和 0.5.5 之后的行为不一致,以源码和 CHANGELOG 为准。
安装与启用¶
社区目录页给出的安装命令是:
dsh plugin add github:flymysql/dsh-remote
目录同时说明:插件以当前 dsh 进程的权限运行,安装时可能执行代码;需要可复现安装时,应固定 commit 哈希:
dsh plugin add github:flymysql/dsh-remote#<commit>
把 <commit> 换成仓库里实际的提交哈希,不要留占位符。
仓库 README 还写了 npm bundle 和指定 profile 的写法。这个插件的客户端只声明了 web,实际使用时一般装进 web profile:
dsh plugin --profile web add dsh-remote
dsh plugin --profile web list
dsh --profile web
dsh 不在 PATH 时,可以用:
npx --yes @deepseek-ai/dsh plugin --profile web add dsh-remote
npx --yes @deepseek-ai/dsh --profile web
Web 界面默认是 http://127.0.0.1:3080 。启动成功后,设置里会出现「远程工作区」;「Add workspace」会带「本机 / 远程」两个 tab。
也可以 npm install dsh-remote,再在 cordis.patch.yml 里加入 - id: dsh-remote / name: dsh-remote。开发迭代时,README 允许把本地检出目录 add 进 profile,测完再用 dsh plugin --profile web remove dsh-remote 回到发行版。
典型用法¶
下面按仓库「快速上手」来,不额外编场景。
1、加一台机器。打开设置 → 远程工作区,填写 host、port、user,以及密码或私钥路径,可选设为当前机。保存前先点「测试连接」。
2、选工作区。在侧边栏或会话里点 Add workspace:
- 本机:系统文件夹选择,或输入本地路径。
- 远程:选机器,浏览到目标目录(或直接输入绝对路径),点「设为远程工作区」。插件会创建并收养本地镜像。
3、让 Agent 在远程干活。把它当普通工作区用,例如:
rw_list_dir(path?)
rw_read_file(path, startLine?, endLine?)
rw_write_file(path, content)
rw_exec(command)
rw_sync / rw_push
rw_pick_workspace 要求绝对目录,且远端必须已经是目录;设好之后提示里会给出本地镜像路径,并建议先 rw_sync 把文件拉下来。rw_read_file 默认最多 2000 行,可用 startLine / endLine 分页。rw_exec 在远程跑构建、测试、grep 这类不是读文件的操作,输出有上限(配置项 maxOutputChars,默认 200000)。
如果希望启动时就带一台默认机,可在 cordis.patch.yml 里写配置。下面是 README 的示例,主机用的是文档保留地址,请换成自己的机器;privateKeyPath 必须显式给出,或改用 password:
# 示例:请换成你自己的机器
- id: dsh-remote
name: dsh-remote
config:
host: 203.0.113.10
port: 22
username: dev
privateKeyPath: ~/.ssh/id_rsa
# 或用密码登录:
# password: '…'
workspace: ~/project
host 为空时,插件启动处于断开状态,到 UI 里再配机器即可。当前源码里还能看到这些配置键:passphrase(加密私钥口令)、commandTimeoutMs(默认 20000)、connectTimeoutMs(默认 15000)、maxOutputChars(默认 200000)。密码非空时走密码认证,不再读私钥。
适用场景与注意事项¶
适合已经在用 DSH Web 界面、代码或构建环境在 SSH 可达主机上的人:开发机、跳板后的业务机、实验室服务器都可以。它解决的是「harness 留在本机环回、工作目录在远端」这件事,并让 Agent 用同一套工作区流程去列目录、改文件、跑命令。
使用前注意这几条,都来自目录页、README 和当前源码,不是推测:
1、权限与安装安全。插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前应检查源代码仓库和许可证。本插件是 MIT,源码在 https://github.com/flymysql/dsh-remote 。
2、把凭据交给插件,等于允许 Agent 以你的用户身份在那台机器上执行 shell。只添加你信任的主机。密码保存在本机文件里,按敏感数据对待,必要时收紧文件 ACL。能用私钥就不要把密码写进配置;私钥路径也要自己显式指定。
3、同步是有界的。rw_sync / rw_push 有深度和文件数上限,不是无限镜像。超大仓库、大量二进制文件不要默认「一次拉全」。单文件修改优先 rw_write_file。
4、Web 专用。客户端 platform 为 web,对等依赖是 DSH 0.1.0-rc.6 这一代包。TUI 或其他 profile 是否可用,仓库没有写成支持声明。
5、同名插件不要混。社区里还有 dsh-remote-ssh、dsh-ssh、dsh-remote-ide 等同样走 SSH 的插件,实现方式和目标不一样。本文只对应 flymysql/dsh-remote。
6、近期有过启动回归。CHANGELOG 写明 0.5.5 / 0.5.6 曾把工具 schema 改成 DSH 值 schema DSL 不接受的形式,导致装了插件后 dsh web 起不来;0.5.7(2026-08-15)已改回叶子属性上的 required: true。新装请确认拿到的是 0.5.7 或之后的版本。
小结¶
DSH 把 Web 界面钉在本机环回,是安全默认值;dsh-remote 不改这个默认值,而是让你从本机连出,把远程目录收成一个可被 harness 收养的工作区,再用 rw_* 工具在远端读、写、执行。维护者是 flymysql,MIT 开源,当前版本 0.5.7。
目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-remote/
GitHub:https://github.com/flymysql/dsh-remote
npm:https://www.npmjs.com/package/dsh-remote