dsh-shell-select:爲 DSH 智能體統一指定 Shell 執行環境

前言

DeepSeek Harness(DSH)裏,智能體通過 shell 類工具在本地執行命令。默認情況下,Harness 自帶的執行器會按平臺選一種 Shell(例如 Windows 上常見 PowerShell,Linux 上跟隨 $SHELL)。若你希望固定用 Git Bash、WSL、cmd.exe、zsh 或 fish,又希望模型側始終只看到一個 shell 工具、不能逐條命令換 Shell,就需要把「用哪種 Shell」做成部署級配置,並在沙箱無法約束所選 Shell 時明確拒絕,而不是悄悄跑出沙箱。

下面介紹社區插件 dsh-shell-select(維護者 athif23,分類:客戶端)。它在 Harness 現有沙箱與執行鏈路上注入一層 Shell 選擇,並通過 Web 設置卡片持久化配置。

這是什麼

dsh-shell-select 是 DeepSeek Harness 插件:面向模型只暴露一個 shell 工具,實際使用的 Shell(PowerShell、Windows PowerShell、cmd.exe、Git Bash、WSL Bash、bash、zsh、fish 或系統 sh)由用戶在設置裏選定。選擇屬於部署配置,不屬於模型;當前權限模式無法約束的 Shell 會被拒絕執行(fail-closed),而不是在沙箱外運行。

  • 目錄頁:https://www.skillhub.cn/plugins/athif23/dsh-shell-select
  • 源碼:https://github.com/athif23/dsh-shell-select
  • 許可證:MIT(README 與 package.json)

核心功能

單一 Shell 貫穿所有 agent 命令

所選 Shell 成爲 ctx.shell,shell 工具、Hook 命令以及 Harness 自身的探測都經它執行。插件會拒絕 Harness 自帶的 bash、pwsh 工具,並在拒絕原因中指向統一的 shell 工具,避免模型混用多套入口。

發現與顯式路徑

Harness 自帶的可執行文件解析按名稱查找 Shell。若安裝路徑非常規或存在多個同名安裝,可在配置裏設置 executable,該路徑優先於自動發現;無法解析或路徑指向另一種 Shell 時會報錯,而不是繼續盲目搜索。

Web 設置卡片

配置保存在 DSH 設置文檔的 shell-select 命名空間下,可在 Settings → Plugins → Shell selection 卡片中選擇 Shell、Save / Discard,並用 Test shell 跑一條固定命令驗證。Test shell 使用的是已保存的配置,不是卡片裏尚未 Save 的暫存編輯。

向模型說明 Shell 語法

每種 Shell 帶有各自的語法說明(例如 PowerShell 路徑、cmd 變量展開、WSL 的 /mnt/...、fish 的非 POSIX 語法),便於智能體寫出與當前 Shell 匹配的命令。

不另建執行棧

deadline、輸出上限、後臺任務與沙箱約束仍由 Harness 提供;插件不增加獨立的執行 machinery。

安裝與啓用

DSH profile 是 ~/.dsh/profiles/<name> 下的 pnpm 項目。在已有 Harness 的 profile(例如 web)中安裝:

dsh plugin --profile web add dsh-shell-select

該命令把參數轉給 profile 目錄中的 pnpm,並把包註冊爲 dsh.profile.bundles 中的一層 bundle;已在列表中的條目不會被改動。正在運行的 profile 仍使用啓動時的 bundle 集合,安裝後需重啓:

dsh web

dsh web 與 dsh --profile web 等價。

若從本地 checkout 開發(資料中的可選方式,需自行承擔源碼審查):

git clone https://github.com/athif23/dsh-shell-select
dsh plugin --profile web add link:/absolute/path/to/dsh-shell-select

link: 安裝保持目錄與 profile 聯動,改插件代碼後重啓 profile 即可生效。插件通過 peerDependencies 聲明 Harness 包,不在插件內再打包一份 Harness。

典型用法

安裝並重啓 profile 後,在應用內:

  1. 打開 Settings → Plugins,展開 Shell selection。
  2. 在下拉框中選擇 Shell。默認 Automatic 會按部署規則解析並顯示實際選中的 Shell。
  3. 點擊 Save;在 Save 之前,修改僅處於暫存狀態,運行時行爲不變。
  4. 點擊 Test shell,通過當前已保存的選擇執行固定測試命令。若返回 refusal,與真實 agent 命令在當前權限下的結果一致。

也可直接編輯 ~/.dsh/settings.yaml 中的 shell-select 段,例如:

shell-select:
  shell: gitbash
  loginShell: false

常用字段(完整表格見 README):

配置項 默認 含義
shell auto 目錄中的 Shell id,或 auto
executable 空 顯式可執行路徑,覆蓋自動發現
loginShell false bash 系 Shell 是否加 -l(每次命令加載 profile)
wslDistro 空 WSL 發行版名,空則用默認發行版
wslMountRoot /mnt WSL 掛載 Windows 盤符的根路徑
enableRunInBackground true 是否在 shell 工具上提供 run_in_background

另有一組自本地 executor 繼承的預算字段(如 cwd、timeoutMs 默認 120000、maxOutputBytes 等),在同一 composition 行裏統一配置。Harness 原有的 pwshPath 對 PowerShell 條目仍然生效。

設置變更隻影響之後的調用,不會改寫已在準備中、運行中或已結束的調用。

平臺支持與權限注意

README 用表格區分「目錄可選」「有人實際跑過 agent 命令」「沙箱拒絕寫工作區外」三檔。簡要結論:

  • Windows(主要平臺):可選 pwsh、powershell、cmd、gitbash、wsl。cmd.exe 與 PowerShell 5.1 在沙箱約束下經驗證可用。Git Bash 與 WSL Bash 在 restricted token 下無法啓動,因此在 workspace-write 與 read-only 下會被拒絕(含設置卡片裏的版本探測);僅在 danger-full-access 下可運行。這是刻意設計:避免使用無法被沙箱約束的 Shell。
  • Linux(次要):CI 上對 bash、sh、pwsh 跑通過插件的執行並斷言 workspace-write 拒絕;獨立審查在無可用沙箱後端的 Linux 上主要驗證了拒絕路徑。zsh、fish 在測試環境中未安裝。
  • macOS:README 標明 unverified,測試 workflow 僅在 Windows 與 Linux 上運行。

Automatic 默認行爲是復刻部署原有邏輯:Windows 上優先解析到 PowerShell;Linux 上跟隨指向目錄條目的 $SHELL。若 executable 指向某個 bash.exe 而 shell 仍爲 auto,則按 bash 參數運行該二進制。

適用場景與安裝前檢查

適合需要在 Windows 上統一用 cmd、PowerShell 或(在 danger-full-access 下)Git Bash / WSL,或在 Linux 上固定 bash / sh / pwsh,且希望智能體只面對一個 shell 工具的 DSH 部署。

插件與 Harness 一樣,在當前 dsh 進程權限下運行;安裝前應閱讀源碼與 MIT 許可證,確認 bundle 行爲符合你的安全策略。社區目錄 SkillHub 與 DeepSeek / 幻方無官方從屬關係,插件來自社區維護者 athif23。

常見報錯(README Troubleshooting):

  • No <shell> executable found:按名稱未找到可執行文件,需安裝或設置 executable。
  • Refused under the current permission mode:當前權限模式無法約束所選 Shell;在 Windows 上 Git Bash / WSL 在 workspace-write / read-only 下屬預期行爲,應換可約束的 Shell 或調整權限模式。
  • Automatic shows unknown:暫存的 executable 尚未被主機解析;Save 後卡片會顯示 Automatic 解析結果。

結尾

dsh-shell-select 把 Shell 選擇收攏爲部署級設置和一個模型-facing 的 shell 工具,在 Harness 原有沙箱上工作,並在無法約束時拒絕執行。需要 Web 卡片或 YAML 細調 WSL、login shell、後臺任務等選項時,可按上文命令安裝並重啓 profile。

  • 插件目錄:https://www.skillhub.cn/plugins/athif23/dsh-shell-select
  • GitHub:https://github.com/athif23/dsh-shell-select
羽毛球分组比赛记分
小程序二维码

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

小夜