前言¶
在 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 類操作可以在沙箱內完成,而不必每條命令都點一次全量提權。