通过 SSH 把远程主机目录作为 Harness 工作区打开:read/write/edit/grep/glob 与 shell 命令经 SFTP、ripgrep、ssh2 exec 直接在远程主机执行,不做本地镜像;多主机注册表加密存储,本地沙箱策略依然生效。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-remote-workspaces
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:januory/dsh-remote-workspaces
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
English | 中文
通过 SSH 把远程主机上的目录,像打开本地文件夹一样,作为DeepSeek Harness 的工作区打开工作。
它做了什么
远程目录一旦被打开为工作区,agent 的文件工具(read / write / edit /grep / glob)和 shell 命令都会直接落到远主机上执行,而不是本地镜像。这里没有镜像、没有同步:每个操作都在远端实时执行,而本地工作区仍保留 harness 自身的完整沙箱行为。
功能特性
- 把远程目录当作工作区打开 —— 浏览远程文件系统、选中目录,harness 会像对待本地目录一样接纳它;所有 I/O 都路由到远端。
- 多主机注册表 —— 增删改 SSH 主机(别名 / 主机 / 端口 / 用户 / 密钥或密码)。凭据在本地用 AES-256-GCM 加密落盘,绝不会回传到浏览器。
~/.ssh/config导入 —— 列出已配置的别名并自动填充连接表单。- 连接测试 —— 使用前先验证主机连通性。
- 透明的工具路由 ——
read/write/edit走 SFTP,grep/glob在远端跑ripgrep,bash/pwsh命令通过 ssh2 exec 执行。路由由会话决定,而不是由路径写法决定:远程工作区内每条命令都在那台主机上执行,指向该主机上不存在路径的 workdir 会被拒绝,而不是落到本地执行。本地会话沿用 harness 自身的沙箱。 - 感知权限策略的远端写操作 —— harness 的文件策略同样作用于远程工作区:
read-only会拒绝write/edit和远程 shell 命令,workspace-write把write/edit限制在远程工作区根目录(以及/tmp)内、而远程 shell 命令需经danger-full-access审批后放行,danger-full-access则交由 SSH 账号自身权限决定。
工作原理
bundle 分为宿主机侧(host)和浏览器侧(browser)两半:
- Host(
src/index.js)—— 基于ssh2的 SSH/SFTP 传输、加密主机存储、分流文件系统(ctx.fs)与 shell(ctx.shell)provider、远程感知的grep/glob工具,以及通过 Typert 暴露的remoteWorkspacesRemote 命名空间。 - Browser(
src/client.js)—— “远程工作区”设置页(按主机分组)以及一个“添加工作区”的选择器。
打开远程目录会创建一个锚点(anchor):一个被 harness 接纳为工作区身份的真实但为空的本地目录,外加一个记录其远程来源的元数据文件。注册表(anchors.json)把该锚点映射到远程主机与路径,所有文件/命令操作都据此查表路由到远端:
$DSH_HOME/remote-workspaces/
├── machines.json # 主机注册表(凭据加密落盘)
├── anchors.json # 锚点 → 远程来源 路由注册表
└── <host>-<user>-<port>/ # 每台主机的锚点
└── <encoded-path>/ # 每个远程路径对应一个空锚点
│ └── .dsh-remote-meta.json
远程完整路径会被编码进锚点目录名(路径分隔符和 Windows 非法字符变成 --),因此 /home/test 和 /data/test 会落到不同的目录(home--test vs data--test)。
环境要求
- 一个 DeepSeek Harness 安装(插件在运行时解析其宿主服务)。
- Node.js ≥ 18(harness 本身运行在 Node 22+)。
ssh2是唯一的传输依赖;不需要外部ssh命令。- 远端主机需要
rg(ripgrep)以支持grep/glob,以及sha256sum(或shasum)用于写入后校验——二者缺失时都会优雅降级。
安装
从本仓库在线安装:
dsh plugin --profile web add github:januory/dsh-remote-workspaces
发布到 npm 后,也可以直接安装已发布的包:
dsh plugin --profile web add dsh-remote-workspaces
从源码安装:
git clone https://github.com/januory/dsh-remote-workspaces.git
cd dsh-remote-workspaces
pnpm install # 安装 ssh2 传输依赖
dsh plugin --profile web add .
卸载:
dsh plugin --profile web remove dsh-remote-workspaces
维护者注:npm 包名现为
dsh-remote-workspaces(早期 git 安装时的包名是remote-workspaces);旧安装请先dsh plugin --profile <name> remove remote-workspaces,再按新名安装。
使用
- 打开 设置 → 远程工作区。
- 添加一台 SSH 主机(或从
~/.ssh/config导入),然后点 测试连接。 - 在“添加工作区”流程里选择远程主机、浏览到某个目录并打开。harness 会把空锚点接纳为工作区,之后的读取、写入、搜索和 shell 命令都在远端执行。
Remote API
宿主通过 Typert 暴露 remoteWorkspaces Remote 命名空间,包含这些调用:
listMachines、saveMachine、deleteMachine、listSshAliases、sshAliasDetail、testConnection、listRemoteDir、openRemoteWorkspace。
目录结构
src/ # DSH bundle 源码
index.js # 宿主入口(分流 fs/shell、搜索工具、Remote 命名空间)
client.js # 浏览器入口(设置页 UI + 选择器)
transport.js # ssh2 传输(SshClient、exec、sha256)
routing-fs.js # 分流文件系统(远端 SFTP / 本地围栏)
fs-sftp.js # SFTP 文件系统后端
local-backend.js # 本地文件系统后端
containment.js # 本地沙箱围栏
shell-exec.js # SshShellExecutor(远端 ssh2 exec / 本地 subprocess)
search.js # 远程感知的 grep/glob 工具
anchor.js # 本地锚点布局(空目录 + 元数据)
registry.js # anchors.json 路由注册表
machine-store.js # 主机注册表(加密落盘)
ssh-config.js # ~/.ssh/config 解析
ssh-uri.js # ssh:// URI 解析与识别
errors.js # 错误码
cordis.patch.yml # DSH bundle patch(换入分流 provider)
package.json # 包 + dsh 清单
test/ # 单元 + 集成测试
测试
纯单元测试(无需任何主机)可在任意环境运行:
pnpm test
集成测试需要访问真实 SSH 主机,且需先配置好主机注册表(默认使用注册表里的第一台主机,或别名为 test 的那台):
pnpm test:integration
发布(维护者)
发布完全手动触发、零输入:版本号直接取自 package.json,发布前先在 main 上提交改好的 version,然后 GitHub Actions → release → Run workflow 即可。工作流会自动执行:跑单元测试(npm test)→ 校验 v<version> tag 尚未存在(防止重复发布)→ npm publish(带 provenance)→ 打 v<version> tag 并推送 → 用 --generate-notes 创建 GitHub Release。
前提:在仓库 Settings → Secrets and variables → Actions 中配置名为 NPM_TOKEN 的 secret(npm automation token,或对该包有 publish 权限的 granular token);发布账号须是持有该包名的 npm 用户。
等价的手工流程:
npm login
npm publish --provenance
git tag "v$(node -p \"require('./package.json').version\")"
git push origin --tags
开源协议
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-remote-web-ui★ 8835
手机/PC 远程操控 dsh web 工作区:扫码配对、令牌门控通道、SSE 实时同步,提供移动端与完整桌面 GUI 两种远程形态。
zhu1090093659/dsh-web#packages/dsh-ssh★ 8835
SSH 远程运维面板:Web 终端、SFTP 传输、本地端口转发与一条命令并发集群执行,Agent 与面板共用同一份主机配置。
saya-ch/dsh-mobile★ 479
通过 Android App 或手机浏览器访问 DeepSeek Harness,支持安全局域网连接、远程访问、持久设备配对和可自定义移动界面。
liguobao/ds-harness-remote★ 345
DeepSeek Harness 多端远程访问:从手机、平板、浏览器或另一台电脑继续进行中的会话,端到端加密通道(Noise IK + 自适应 Relay/WebRTC 传输),设备授权管理;远程端仅开放 ApiProxy 能力,支持 dsh-file-viewer 只读文件预览,不提供 Shell、远程桌面或写入权限。
ZSeven-W/dsh-ios★ 326
在对话里直接操作 iOS 模拟器或 USB 连接的 iPhone:22 个 Agent 工具用于启动、构建、按无障碍标识或 OCR 文本驱动 UI、列表行操作与 SwiftUI 预览热重载,并附带可点击拖拽的流式侧边栏面板。
wenbin-wb/dsh-bridge★ 199
DeepSeek Harness 远程与移动端接入插件:提供局域网扫码直连、Cloudflare 与自建公网隧道,以及微信、QQ、飞书、Telegram 机器人交互,内置安全认证与访问控制。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。