dsh-sandboxie-redirect:在 Windows 上为 DSH 增加「写时复制」权限预设

前言

在 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」导致启动失败。

典型用法

  1. 在 Windows 上装好 Sandboxie-Plus 与 DSH,按上一节安装 bundle 并重启。
  2. 打开目标工作区,将权限预设切到 写时复制,再让 agent 通过 shell 执行可能触及工作区外的命令(例如写临时目录、改用户配置路径下的文件)。
  3. 用 DSH 文件工具查看工作区外路径,确认真实磁盘未被改动;用 shell 在同一预设下读取同一路径,可看到盒内合并视图(若命令曾写过该路径)。
  4. 需要释放副本占用时,在会话中调用 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。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye