前言¶
在 DeepSeek Harness(DSH)里让模型执行 go build、npm install 一类命令时,默认的 workspace-write 沙箱只允许写入工作区、/tmp 和用户临时目录。Go 编译缓存、npm 缓存、Cargo 目录等却落在工作区外,内核会拒绝写入,模型只能反复申请 danger-full-access 提权,界面上就会出现大量审批弹窗。社区插件 dsh-sandbox-tune(维护者 kennethfan,分类 admin-security)针对这类文件沙箱边界问题,用缓存重定向、可写目录授权和可选的命令自动批准,尽量在沙箱内完成日常开发命令,而不是每次都升权。
这是什么¶
dsh-sandbox-tune 是 DSH 的沙箱调优插件:让 go build / go test / npm install 等开发命令在沙箱内正常跑通,减少重复的提权审批弹窗。
插件通过 cordis.patch.yml 替换 DSH 自带的 bash-sandbox / pwsh-sandbox / sandbox 相关实现,提供执行器(sandbox-tune-bash)和沙箱 provider(sandbox-tune-provider)两套能力。依赖 DSH 自带的 dsh-bash-sandbox、dsh-sandbox-local、dsh-shell 等,无需额外安装第三方沙箱组件。
版本要求(以 README 为准):DSH 0.2.1-rc.2 或更高(插件在该版本上开发与验证);运行平台为 macOS / Linux / Windows,具体能力因后端而异。插件当前包版本为 0.1.6,许可证 MIT。
目录页:https://www.skillhub.cn/plugins/kennethfan/dsh-sandbox-tune
源码与文档:https://github.com/kennethfan/dsh-sandbox-tune
为什么会有弹窗¶
DSH 文件沙箱(workspace-write)的可写范围可以概括为:
工作区目录 + /tmp + 用户临时目录($TMPDIR)
常见构建工具却把缓存写到沙箱外,例如 Go 的 GOCACHE、GOMODCACHE,npm 的 NPM_CONFIG_CACHE,Cargo 的 CARGO_HOME。在 macOS 上常表现为 Seatbelt 的 Operation not permitted。README 中同一沙箱内的对比示例:
GOCACHE=~/Library/Caches/go-build go build ./... → exit 1(operation not permitted)
GOCACHE=$TMPDIR/dsh/go-build go build ./... → exit 0
插件作者根据本机 517 次历史审批统计,将弹窗原因大致分为:构建缓存写不进去(约 28%)、写工作区外用户配置目录(约 27%)、gh 读钥匙串(约 19%,非文件路径问题,插件不支持)、写 ~/.dsh profile(约 11%,部分可用 sandboxRoots)、其余约 15% 不适合用白名单放宽。
核心功能¶
下面介绍三个能力模块及其作用域。
| 模块 | 作用 | 作用域 |
|---|---|---|
| 缓存处理 | 纯缓存重定向,或在 in-place 下授权真实缓存目录 |
全局 + 会话 |
| 可写目录授权 | 将用户级目录等加入沙箱白名单 | 全局 + 会话 |
| 命令授权 | 按规则自动批准沙箱升权 | 仅全局 |
两种工作模式¶
mode 只在执行器 sandbox-tune-bash 上配置一处,provider 会跟随。
| 模式 | 做法 | 与终端共用缓存 | 后端要求 |
|---|---|---|---|
| redirect(默认) | 用环境变量把纯缓存指到 $TMPDIR/dsh(或 cacheRoot) |
否,两套独立 | 任意后端 |
| in-place | 路径不变,把真实缓存目录授权为可写 | 是 | Seatbelt / bwrap;不支持时回退 redirect |
缓存分两类,处理方式不同:
- 纯缓存(cache):如
GOCACHE、NPM_CONFIG_CACHE、PIP_CACHE_DIR,丢失只会变慢,可在redirect下重定向。 - 依赖仓库(store):如
GOMODCACHE、CARGO_HOME,重定向到空目录会导致编译失败;redirect不动 store 类,仅在in-place下授权。
自动探测路径¶
启用 autoDetect 时,插件在 Host 侧执行只读命令(如 go env GOCACHE、npm config get cache)获取本机真实路径。静态默认值可能猜错(例如 gvm 下的 GOMODCACHE),猜错等于未授权。
用户级目录预设¶
userDirs 预设包括 ~/.config、~/.cache、~/.local/share、~/.local/state 等,默认全部不勾选;勾选会扩大可写边界,界面与文档中均标明了收益与风险。user-cache 刻意不使用 macOS 的 ~/Library/Caches,仅 XDG 风格的 ~/.cache。
命令授权(可选)¶
全局字段 autoApproveMode 可为 off、exact、safe-args;规则列表为 autoApproveCommands。这是放宽升权审批,需自行评估风险;默认 off。
安装与启用¶
推荐安装预构建 tarball,避免 dsh plugin add 对 npm/git 源触发 allowBuilds 构建授权:
dsh plugin --profile web add https://github.com/kennethfan/dsh-sandbox-tune/releases/latest/download/dsh-sandbox-tune.tgz
也可从 GitHub 安装(会走源码构建,首次稍慢):
dsh plugin --profile web add github:kennethfan/dsh-sandbox-tune
装完后重启 DSH。插件自带的 cordis.patch.yml 会禁用 base 的三行 sandbox 相关服务并替换为本插件实现。
全局配置可在左侧「设置」→「沙箱调优」修改,或直接编辑 profile 的 cordis.patch.yml;插件监听该文件,无需重启 DSH 即可热更新。会话级可通过会话标题右侧「沙箱调优」或 /sandbox-tune 覆盖部分字段(列表字段叠加全局,标量字段替换全局)。
执行器配置示例(YAML 片段):
- id: sandbox-tune-bash
name: 'dsh-sandbox-tune/executor'
config:
enabled: true
mode: redirect
cacheRoot: ''
presets: [go, npm, bun, pip]
env: {}
autoApproveMode: off
autoApproveCommands: []
Provider 配置示例:
- id: sandbox-tune-provider
name: 'dsh-sandbox-tune/provider'
config:
enabled: true
autoDetect: true
presets: [go, npm, bun, cargo]
sandboxRoots: []
userDirs: []
典型用法¶
- 安装插件并重启 DSH 后,在全局「沙箱调优」中保持默认 redirect,勾选需要的工具预设(go、npm、bun、pip、cargo 等)。
- 若希望与本地终端共用同一份 Go/npm 缓存,且沙箱后端支持 Seatbelt 或 bwrap,将 mode 改为 in-place;不支持时会自动回退 redirect。
- 若 CLI 仍因
~/.config等目录写入失败,在 provider 卡片中按需勾选用户级目录预设,而不是一次性全开。 - 需要持久化 redirect 缓存时,可将
cacheRoot设为工作区内路径(如.dsh/cache),并加入.gitignore;或改用 in-place。
README 建议用 go build ./...、npm install 等在沙箱内验证是否仍触发弹窗;关闭插件 enabled: false 可退化为原生执行器做对比。
适用场景与注意¶
适合谁:长期在 DSH 里跑 Go、Node、Python、Rust 等构建与安装命令,且希望默认留在 workspace-write 沙箱内完成的开发者。
能力边界:gh 读钥匙串、进程管理、随意删除清理等弹窗,插件文档标明不适合或未支持;命令自动批准仅全局配置,会改变安全边界,应谨慎开启。
安全与信任:插件以当前 DSH 进程的权限运行,会修改沙箱白名单与环境变量,并可选自动批准升权。安装前应阅读源码与 MIT 许可证,确认符合你的安全策略。SkillHub 上的插件目录为社区站点,与 DeepSeek / 幻方无官方从属关系;星标与版本以 GitHub 页面为准。
已知限制:redirect 模式下 macOS 可能周期性清理临时目录,重启后首次编译偏冷;in-place 依赖沙箱后端能力;pip/cargo 的自动探测使用静态默认值。
结尾¶
dsh-sandbox-tune 从缓存重定向、目录白名单和可选命令授权三个层面,缓解 DSH 开发命令与 workspace-write 沙箱之间的常见冲突。经过上面的步骤安装并在「沙箱调优」中按需配置后,多数 go build、npm install 类操作可以在沙箱内完成,而不必每条命令都点一次全量提权。