前言¶
在 DSH 里跑智能体时,shell 往往是改动面最大的入口:一条命令可能改工作区外的配置、临时文件或系统目录。DSH 自带「只读」「仅工作区可写」「完全权限」三档预设,前两档会直接拒绝区外写入,第三档则几乎不设限。若你希望 区外写入在命令侧仍算成功,但不污染真实磁盘,同时又保留工作区内写入落盘、以及 DSH 文件工具「工作区内可写、区外拒绝」的既有规则,就需要额外的隔离层。
下面介绍社区 bundle dsh-sandboxie-redirect(维护者 lone-wolf-akela,SkillHub 分类 admin-security)。它在不修改 DSH 应用本体的前提下,增加第四种权限预设 Copy-on-write(写时复制):shell 命令在 每个工作区专属的 Sandboxie 沙盒 中执行。
这是什么¶
@lone-wolf-akela/dsh-sandboxie-redirect 是发布在 npm 上的 DSH bundle(当前 package 版本 0.3.4,MIT 许可)。安装后会自动挂载配置层,无需手改 profile 文件。平台要求 Windows 10/11,且需预先安装 Sandboxie-Plus 并保持其 沙盒服务在运行。
插件定位是 权限预设,不是对 DSH 应用的补丁。设计目标是防误写、便于撤销误操作、减少系统目录被 agent 命令弄脏;README 明确说明 不能当作对抗恶意程序的安全边界——Sandboxie 本身也不作此类承诺,且插件与承载它的 DSH 进程拥有同等权限。
核心功能¶
写时复制预设的行为¶
| 位置 | shell 命令(盒内)的行为 |
|---|---|
| 工作区内写入、修改、删除 | 直接作用于真实磁盘 |
| 工作区外写入、修改 | 命令报告成功,改动落在该工作区沙盒的 副本 中,真实磁盘不变 |
| 工作区外删除 | 真实文件保留;副本中仅记录删除标记 |
DSH 自带的读/写/编辑文件工具在 盒外 运行,规则与「仅工作区可写」一致:工作区内可写,区外拒绝。因此同一路径可能出现 读侧分歧——盒内 shell 读到的是 Sandboxie 的合并视图(含副本覆盖),盒外文件工具读到的是真实磁盘。验证「命令在工作区外写了什么」用 shell 读;验证「真实磁盘是否被改动」用 DSH 文件工具或资源管理器。
界面与会话内工具¶
- 权限下拉与底部按钮中会出现 ❐ Copy-on-write 写时复制 预设(带复制双矩形图标;名称前的
❐用于在出厂图标映射下保证可见)。 - 启用写时复制且工作区已创建沙盒后,标题栏 会显示沙盒名(例如
dsh_able_willow);第一条 shell 命令之后才会出现,切换预设或清理沙盒后消失。 - 会话内提供
sandbox_clear工具:mode: "inspect"查看副本规模,mode: "clear"删除副本与相关配置;另有诊断用的mode: "status"(0.3.3 起可用),标题栏不显示沙盒名时可先查它。 - 写时复制模式下,会话策略文本会追加一段说明,告知模型本模式行为,减少模型自行推断。
原有三个预设(read-only、workspace-write、danger-full-access)行为保持不变。
安装与启用¶
前置条件:安装 Sandboxie-Plus,确保服务可用。插件会通过注册表(SbieSvc 的 ImagePath 等)、常规安装路径、PATH 及兜底扫描定位 SbieDll.dll;全部失败时可设置环境变量 DSH_SBIE_DIR 指向安装目录(含 SbieDll.dll 的文件夹)。DSH 安装位置同样自动探测;非常规布局可参考 README 中的 DSH_SBIE_NODE、DSH_SBIE_KOFFI 等可选变量。
bundle 安装命令如下(将 <profile> 换成你的 profile 名):
dsh plugin --profile <profile> add @lone-wolf-akela/dsh-sandboxie-redirect
安装后可用 --dump-config 核对是否出现配置层标记,再启动 DSH:
dsh --profile <profile> --dump-config # 应看到 "# == @lone-wolf-akela/dsh-sandboxie-redirect"
dsh --profile <profile>
本地 checkout 或离线包也可添加(示例来自官方 README):
dsh plugin --profile <profile> add C:\path\to\dsh-sandboxie-redirect
dsh plugin --profile <profile> add .\lone-wolf-akela-dsh-sandboxie-redirect-0.3.1.tgz
profile 注意:若 profile 由正在运行的桌面应用独占(如 desktop),CLI 会拒绝修改;此时应在 DSH 内 设置 → 插件 → 添加 bundle,填写包名 @lone-wolf-akela/dsh-sandboxie-redirect。
经过上面的步骤后 重启客户端,在权限下拉中选择 ❐ Copy-on-write 写时复制 即可使用。
若你曾用手工方式把插件拷到 ~/.dsh/plugins/ 并在 cordis.patch.yml 里加 loader 行,切到 bundle 通道前须删除那些行,否则会出现「resolves from multiple active Loader sources」导致启动失败。
典型用法¶
- 在 Windows 上装好 Sandboxie-Plus 与 DSH,按上一节安装 bundle 并重启。
- 打开目标工作区,将权限预设切到 写时复制,再让 agent 通过 shell 执行可能触及工作区外的命令(例如写临时目录、改用户配置路径下的文件)。
- 用 DSH 文件工具查看工作区外路径,确认真实磁盘未被改动;用 shell 在同一预设下读取同一路径,可看到盒内合并视图(若命令曾写过该路径)。
- 需要释放副本占用时,在会话中调用
sandbox_clear的clear模式,或在 盒外 使用随包提供的管理 CLI:
node bin\dsh-sbie-run.mjs --manage list
node bin\dsh-sbie-run.mjs --manage clean "<工作区>"
node bin\dsh-sbie-run.mjs --manage delete-box <沙盒名>
--manage 与 SandMan 图形界面均须在沙盒外操作。卸载 bundle 只会去掉预设与配置行,沙盒与副本仍留在磁盘上;收回空间前应先清理。
适用场景与注意¶
适合:在 Windows 上用 DSH 做 agent 开发或日常自动化,希望 shell 误写区外文件时可一键丢弃副本、工作区内改动仍正常落盘,且不想每次都在「完全权限」与「区外全拒」之间二选一。
不适合或需知:
- 非 Windows 环境无法使用(package.json 中
os为win32)。 - 副本 不会自动回收,长期会话可能占磁盘;写回真实磁盘需通过 SandMan 恢复,
sandbox_clear只删不写回。 - 同一工作区的并发 shell 命令 共用一个沙盒,彼此可见。
- 写时复制下若某次命令 升权,该次调用整体在盒外运行,下一条命令回到盒内;这与「把某个副本文件写回真盘」不是一回事。
sandbox_permissions的通用参数描述在所有预设下共用,写时复制下区外写入 不会被拒,升权是主动让单次调用作用于真实磁盘,而非失败后的补救。- 插件以 当前 DSH 进程权限 运行;安装前请阅读 GitHub 仓库 源码与 MIT 许可证,自行评估是否满足你的安全要求。社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系,属于 DSH「一切皆插件」生态中的独立收录。
dsh-sandboxie-redirect 把 Sandboxie 的 per-workspace 沙盒接到 DSH 权限体系里,用写时复制在「命令可探索区外」与「真实磁盘少被弄脏」之间折中。进一步了解实现与环境变量细节,见 GitHub README(含中文版);在目录站检索与收藏见 SkillHub。