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
羽毛球分组比赛记分
小程序二维码

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

小夜