把文件与命令执行迁到 E2B 沙箱,崩溃后自动恢复并同步工作区
26.6/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add weijiafu14/dsh-remote-sandbox该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · security
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 81 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 24 处,展示前 19 条)
- 发起网络请求packages/keeper/src/client.ts:84
terminate(): void { void this.client.request('proc.terminate', { ch: this.ch }).catch(() => {}) } - 发起网络请求packages/keeper/src/client.ts:128
async ping(): Promise<void> { await this.request('sys.ping', {}) } - 发起网络请求packages/keeper/src/client.ts:129
realpath(path: string, cwd?: string): Promise<{ canonical: string }> { return this.request('fs.realpath', { path, cwd }) } - 发起网络请求packages/keeper/src/client.ts:130
stat(path: string): Promise<StatResult | null> { return this.request('fs.stat', { path }) } - 发起网络请求packages/keeper/src/client.ts:131
lstat(path: string, cwd?: string): Promise<LstatResult | null> { return this.request('fs.lstat', { path, cwd }) } - 发起网络请求packages/keeper/src/client.ts:133
listDir(path: string): Promise<{ entries: DirEntry[] }> { return this.request('fs.listDir', { path }) } - 读取本地文件packages/keeper/src/keeper.ts:185
const bundle = await readFile(sidecarBundlePath()) - 写入本地文件packages/sidecar/build.mjs:13
mkdirSync(join(here, 'dist'), { recursive: true }) - 读取本地文件packages/sidecar/src/fs-ops.ts:52
const real = await realpath(current) - 读取本地文件packages/sidecar/src/fs-ops.ts:85
bytes = await readFile(path) - 读取本地文件packages/sidecar/src/fs-ops.ts:98
return await readFile(path) - 读取本地文件packages/sidecar/src/fs-ops.ts:107
names = await readdir(path, { withFileTypes: true }) - 读取本地文件packages/sidecar/src/fs-ops.ts:124
const bytes = await readFile(path) - 读取本地文件packages/sidecar/src/fs-ops.ts:179
const raw = await readFile(p.path) - 读取本地文件packages/sidecar/src/main.ts:167
const stream = createReadStream(path, { highWaterMark: READ_STREAM_CHUNK }) - 执行外部命令来自配置/变量packages/sidecar/src/proc-ops.ts:51
child = nodeSpawn(program, args, { - 写入本地文件packages/sidecar/src/util.ts:93
await rename(tmp, targetPath) - 删除本地文件packages/sidecar/src/util.ts:95
await unlink(tmp).catch(() => {}) - 写入本地文件packages/subprocess-remote/src/collected.ts:42
appendFileSync(this.spillFd, buf)
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 远程沙箱执行文件与命令
- 崩溃后自动恢复
- 工作区同步
为 DeepSeek Harness 打造的崩溃可恢复远程执行环境:在 E2B 沙箱上提供 ctx.fs/ctx.subprocess,带心跳保活、透明恢复和工作区同步。
README
由 DeepSeek 最新模型翻译生成dsh-remote-sandbox
面向 DeepSeek Harness(dsh)的生产级远程执行世界:将 ctx.fs 和 ctx.subprocess 迁移到 E2B 沙箱中,使其能在崩溃后存活、在高负载下保持运行,并让你的工作区保持同步——这些正是官方 @deepseek-ai/dsh-e2b 概念验证明确遗漏的部分。
第三方插件套件。与 DeepSeek 无关联。MIT 许可。
为什么
dsh 的能力接缝让一次 provider 替换就能把整个执行世界迁移到远程沙箱——Bash、PTY 和 LSP 会跟随 ctx.fs/ctx.subprocess,无需分叉。官方 dsh-e2b 包证明了该接缝可行,但按其自身 README 所述,它只是一个 POC:沙箱“被刻意设计为临时性的”,五分钟后即销毁,将进程的完整输出保留在宿主机内存中,并且“既不上传也不同步宿主机工作区”。本套件让该执行世界可用于真实工作。
展开完整文档(README 剩余 1 节)
dsh-remote-sandbox 面向 DeepSeek Harness(dsh)的生产级远程执行世界:将 ctx.fs 和 ctx.subprocess 迁移到 E2B 沙箱中,使其能在崩溃后存活、在高负载下保持运行,并让你的工作区保持同步——这些正是官方 @deepseek-ai/dsh-e2b 概念验证明确遗漏的部分。 第三方插件套件。与 DeepSeek 无关联。MIT 许可。 为什么 dsh 的能力接缝让一次 provider 替换就能把整个执行世界迁移到远程沙箱——Bash、PTY 和 LSP 会跟随 ctx.fs/ctx.subprocess,无需分叉。官方 dsh-e2b 包证明了该接缝可行,但按其自身 README 所述,它只是一个 POC:沙箱“被刻意设计为临时性的”,五分钟后即销毁,将进程的完整输出保留在宿主机内存中,并且“既不上传也不同步宿主机工作区”。本套件让该执行世界可用于真实工作。 | | 官方 dsh-e2b(POC) | dsh-remote-sandbox | | 沙箱生命周期 | 固定 5 分钟,然后删除 | 心跳保活,与任务同生命周期 | | 连接断开 / 暂停 | 无——沙箱死亡即任务死亡 | 透明恢复:恢复已暂停的沙箱(磁盘保留) | | 硬崩溃 | 无 | 重新创建 + 从上次同步的快照恢复工作区 | | 宿主机工作区 | 不上传也不同步(仅路径拼写镜像) | 打开时 tar IN,请求/拆除时 tar OUT,独立于 .gitignore 的排除规则 | | 进程输出内存 | 完整流保留在宿主机内存中(POC 承认这破坏了接缝的边界) | 有界的内存尾部 + 可选的宿主机溢出文件——宿主机内存有上限 | | 每次 fs 操作的往返次数 | 每次变更需 3–8 次 SDK 命令(realpath、stage、rename、xattr……) | 一次——sidecar 在沙箱内以原子方式完成读-改-发布 | | glob/grep(tool-fs-search) | 在远程世界中损坏(见下文) | 可用——ripgrep 随 sidecar 一起提供 | | 自定义同步后端 | 不适用 | syncIn/syncOut 可通过 cordis.yml(!!js)覆盖 | 架构 宿主机(dsh 进程) 沙箱(E2B) ┌───────────────────────────┐ ┌──────────────────────────┐ │ agent 循环、LLM 密钥、 │ │ sidecar(单个纯 JS │ │ 会话、工具 │ │ 打包,无原生依赖) │ │ │ 一个 WSS │ ├─ fs 原语 │ │ dsh-fs-remote ───────────┼──────────────►│ ├─ 进程树 │ │ dsh-subprocess-remote ────┤ 结构化 │ └─ ripgrep │ │ dsh-sandbox-keeper │ 协议 │ │ │ ├─ E2B 生命周期 │ │ 工作区 ◄─ tar IN/OUT │ │ ├─ 心跳 / 恢复 │ └──────────────────────────┘ │ └─ tar 同步 │ └───────────────────────────┘ - sidecar 是一个约 160 KB 的纯 JavaScript 文件(内联了 WebSocket 服务器,没有原生绑定)。keeper 将其上传,并用沙箱自带的 Node 运行它。它在本地执行原语,因此一次文件系统变更只需一次往返,而不是一连串 SDK shell 命令。 - keeper 拥有沙箱:它部署 sidecar,向前推进暂停截止时间以保持沙箱存活,并在连接断开时恢复已暂停的沙箱(磁盘,以及通过 E2B 的内存快照保留的 sidecar 本身),或者——仅当沙箱确实已消失时——重新创建它并恢复工作区。LLM 和 git 凭据永远不会进入沙箱。 - providers 是轻量适配器:每次 ctx.fs/ctx.subprocess 调用都通过 keeper 推导出当前的 sidecar 客户端,因此恢复操作会在 provider 毫无察觉的情况下在底层替换连接。 安装 dsh plugin --profile add dsh-remote-sandbox export E2B_API_KEY=e2b_... # get one at https://e2b.dev/dashboard dsh-remote-sandbox 包叠加在 dsh-base 之上:它禁用本地的 subprocess 和 fs-sandbox provider,并插入 keeper 以及远程 provider。Bash、terminal 和 LSP 在它们之上保持不变地组合。 若要改为手动接线,请在 cordis.yml 中禁用 dsh-subprocess-local 和 dsh-fs-sandbox,并插入: - id: sandbox-keeper name: dsh-sandbox-keeper config: cwd: /home/user/workspace # workspace path inside the sandbox hostWorkspace: !!js process.cwd() # local project synced in/out - id: subprocess-remote name: dsh-subprocess-remote - id: fs-remote name: dsh-fs-remote 配置(dsh-sandbox-keeper) | 键 | 默认值 | 含义 | | apiKey | $E2B_API_KEY | E2B API 密钥;绝不会转发到沙箱中 | | template | E2B 基础镜像 | E2B 模板 id(基础镜像自带 Node) | | cwd | /home/user/workspace | 沙箱内的工作区路径 | | hostWorkspace | process.cwd() | 主机项目,在打开时同步进去,在请求/拆除时同步出来 | | timeoutMs | 300000 | 暂停截止时间;心跳会将其向前推进 | | heartbeatMs | 30000 | 保活与存活检测间隔 | | excludes | node_modules、.pnpm-store、.dsh-remote-sidecar | 永不同步的路径段(.git 会被同步) | | pauseOnDispose | true | 拆除时暂停(保留磁盘)而非杀死 | | syncIn / syncOut | 通过 sidecar 的 tar | 用你自己的函数(!!js)覆盖,用于 git、对象存储、PVC 等 | 此方案绕过的两个上游 bug 在针对 deepseek-harness@0.1.0-rc.6 构建时发现: 1. tool-fs-search 硬编码了宿主机的 ripgrep 路径。 runRipgrep 将 resolveRgPath() —— 宿主机 @vscode/ripgrep 二进制的绝对路径 —— 作为 argv[0] 启动,而没有经过 resolveExecutable。该插件位于随附的 dsh-base 包中,但任何远程执行环境都缺少该宿主机路径,因此 glob/grep 在每次调用时都会失败。官方的 e2b 示例通过不挂载该插件来规避此问题。本套件将 ripgrep 与 sidecar 一起发布,因此该工具可以正常工作。 2. 沙箱权限模式没有远程语义。 dsh-fs-sandbox 扩展了 LocalFileSystem,并且 writableRoots() 混入了宿主机的 /tmp/os.tmpdir(),因此 read-only 和 workspace-write 在远程环境中会静默地不生效 —— e2b 示例被迫硬编码为 danger-full-access。sidecar 会针对沙箱自身的路径自行强制执行该模式。 已知限制与推迟的工作 - 终端(spawnTerminal)是实验性的,尚未被测试覆盖。 远程沙箱面向非交互式 agent 工作 —— 读/写/编辑、构建、测试、grep —— 这些从不需要 pty;该路径已得到充分测试。交互式终端是罕见情况,因此 spawnTerminal 以尽力而为的方式发布:它运行在 E2B 原生 pty 之上(输出、输入、调整大小和终止都是真实的),但该 API 不暴露前台进程组或输入等待的事实,因此 inspectForeground 报告会话 pid 和 inputWaiting: false,并且尚无测试覆盖它。计划中的重构: 通过预构建的 node-pty 将 pty 移入 sidecar,使其拥有真正的前台进程组(tcgetpgrp)和输入等待检测 —— 与本地终端完全对等,并且它将 pty 带到与其他所有内容相同的 sidecar 通道上。如果你的部署不打开交互式终端,这不会影响你。 - 恢复在断连前后的时刻是至少一次的。 在崩溃前几秒内发出的文件写入或命令在恢复后可能尚未生效;keeper 会注入一条模型可见的通知(通过 notify / consumeRecoveryNotice()),以便 agent 重新检查目录树。 - OUT 同步按设计是低频的。 恢复首先依赖暂停沙箱保留的磁盘;tar 快照是针对真正被删除的沙箱的兜底方案,因此没有每次写入的同步开销。如果你的部署需要,可以通过自定义 syncOut 启用周期性 OUT。 - 上游为预发布版本。 dsh 处于开发者预览阶段,不承诺兼容性;peer 版本被宽松地固定,随着 harness 的演进可能需要升级。 开发 pnpm install pnpm -r run build # tsc + esbuild the sidecar bundle pnpm test # 37 unit + provider tests (no sandbox needed) E2B_API_KEY=... pnpm test:e2e # 6 real-E2B killer scenarios 单元测试套件会将真实的 sidecar 包作为本地进程启动,并驱动线协议、通过真实的 dsh FileSystem/SubprocessRuntime 基类驱动各 provider,以及针对假后端驱动 keeper 的生命周期/恢复/同步。E2E 套件会针对真实的 E2B 沙箱运行六个场景——保活、恢复、重建、有界 grep、tar 往返、自定义同步。 包 | 包 | 角色 | | dsh-remote-protocol | sidecar 与宿主共享的线协议 + 编解码器 | | dsh-remote-sidecar | 沙箱内执行器(单个打包文件) | | dsh-sandbox-keeper | ctx.remoteSandbox:E2B 生命周期、心跳、恢复、同步 | | dsh-fs-remote | ctx.fs provider | | dsh-subprocess-remote | ctx.subprocess provider | | dsh-remote-sandbox | 在 dsh-base 上串联以上三者的单行 bundle | 许可证 MIT
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
weijiafu14/dsh-remote-sandbox
把文件与命令执行迁到 E2B 沙箱,崩溃后自动恢复并同步工作区
相关插件 · 安全 / 权限
智能体逆向工程morluto/rea
用智能体逆向工程任何东西,从应用行为到原生二进制。
★ 422,036已汉化DSH
73.3
智能体集群框架ruvnet/ruflo
面向 Claude Code 与 Codex 的智能体元基座meta-harness。
★ 80,619已汉化MCP
71.8
WorkBuddy 模型接入corrinehu/dsh-workbuddy-connect
2026 年 10 月 20 日起,WorkBuddy…
★ 1,604已汉化DSH
71.7
破甲一键通z91772524-ai/pojia-next
十五个 AI…
★ 1,004已汉化DSH
71.6
Agent 操作层agentic-os-org/ANOLISA
ANOLISA(Agentic Nexus Operating Layer & Interface System Architecture)|智能体操作系统,带运行时、安全、可观测性,以及 Tokenless 响应压缩,降低 token 用量与成本。
★ 653已汉化DSH
70.7
AI 代理虚拟终端strukto-ai/mirage
Mirage 是给 AI 智能体用的虚拟终端:一层 shell,统管数据、命令行和运行时。Unix…
★ 3,762已汉化DSH
70.7