前言¶
在 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。