dsh-sandbox-tune: Running go build and npm install in the DSH sandbox

前言

在 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: []

典型用法

  1. 安装插件并重启 DSH 后,在全局「沙箱调优」中保持默认 redirect,勾选需要的工具预设(go、npm、bun、pip、cargo 等)。
  2. 若希望与本地终端共用同一份 Go/npm 缓存,且沙箱后端支持 Seatbelt 或 bwrap,将 mode 改为 in-place;不支持时会自动回退 redirect。
  3. 若 CLI 仍因 ~/.config 等目录写入失败,在 provider 卡片中按需勾选用户级目录预设,而不是一次性全开。
  4. 需要持久化 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 类操作可以在沙箱内完成,而不必每条命令都点一次全量提权。

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

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

Xiaoye