dsh-bash:在 DSH 里单独挂载带 sandbox 语义的 ops_bash

前言

在 DeepSeek Harness(DSH)里跑智能体时,shell 工具往往要和宿主的 sandbox、审批、输出溢出(spill)以及后台 job 对齐。完整运维套件 dsh-ops 会带上 file、PTC、discovery 等一整条组件链;若你只想在 Windows 或 POSIX 上稳定发布 ops_bash,又不想引入 @deepseek-ai/* 运行时依赖,就需要一条更窄的插件路径。下面介绍社区插件 dsh-bash(维护者 null0xfff,分类 admin-security):从 dsh-ops 0.4.1(commit dfafddc)抽出的 bash 组件,只做 shell 这一条线。

这是什么

dsh-bash 是标准 DSH 插件形态(dsh-plugin.json manifest v0.15 + cordis.patch.yml 中的 dsh-bash-shell 行 + ./shell 组件导出)。它把 ops_bash 发布成具备宿主管辖语义的 shell 工具,通过 ctx.get('subprocess')、ctx.get('sandboxPolicy')、ctx.get('sandbox')、ctx.get('jobs') 借用宿主服务,加载期不导入任何 @deepseek-ai/* 的运行时值(仅类型导入)。

与宿主原生 bash 工具相比:多一个 script_path 参数、更严格的参数校验,以及带 failure.code / effectState / retry 的结构化失败信息。file、PTC、discovery、panel、TUI、hide-official 等 dsh-ops 其余组件行均未移植;不再托管 PowerShell,宿主 pwsh 保持原样,仅在路由提示词中提及。

核心功能

ops_bash 与解析链

插件按 session / agent 维度发布与撤销工具,并跟随 sandboxPolicy 变化。bash 可执行文件解析顺序(src/shells/resolve.ts)为:

  1. 配置项 bashPath(不可用则报错,不会静默换 shell)
  2. <DSH_HOME>/dsh-bash/shells/bash/<version>/bin/bash.exe
  3. 包内 vendor/bash/<platform>-<arch>/ 或 @dsh-bash/bash-<platform>-<arch> 平台包
  4. 仅当 allowSystemShellFallback: true 时回落 PATH 与常见安装位置(Windows 会排除 WSL 的 System32\bash.exe)

POSIX 上可直接使用发行版自带的 bash,同样支持 bashPath 覆盖。

Windows bash 载荷与受限模式

Windows 无内置 POSIX bash 时,可用运维命令下载并校验钉住的上游发行版(PortableGit 2.56.0.2):

node bin/dsh-bash.mjs provision
node bin/dsh-bash.mjs status

danger-full-access 下任意解析到的 bash 均可执行。在 read-only / workspace-write 等受限模式下,Windows 仅运行固定版本的 MSYS:需存在 runtime/win32-x64/bash-ipc/provenance.json,并对 msys-2.0.dll 与 IPC 代理 DLL 做摘要校验。构建 IPC 代理需要 MSVC 工具链:

$env:DSH_OPS_VCVARS64 = "C:\Program Files\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
node bin/dsh-bash.mjs build-ipc

无回执时受限模式会明确拒绝并给出修复路径,不会退化为不受限执行。

配置(cordis.patch.yml 中的 dsh-bash-shell 行)

键 默认 说明
bashPath — 绝对路径;设置后以它为准
publishBashTool true 是否发布 ops_bash
shellPolicy advise deny-host-shell 会隐藏并拒绝宿主 bash / pwsh / pwsh_persistent
deniedHostTools 上述三个 deny-host-shell 的拒绝清单
promptPolicy true 是否发布 shell 路由提示词段
extraGuidance "" 追加到提示词段的说明
allowSystemShellFallback false 是否允许回落系统 bash(Windows 需显式打开)

serverName、enableShellTools、toolCallTimeoutMs 为自 dsh-ops 迁移时的遗留键:接受并忽略,便于复制旧配置。

与 dsh-ops 并存

包名、配置段名、DSH_HOME 子目录均为 dsh-bash,与 dsh-ops 互不读取对方 store。无 file 工具凭据围栏、结果引用或 PTC SDK,因此不需要 ctx.get('result') 等服务。

安装与启用

仓库 lib/ 已提交,从 git 安装无需本地 TypeScript 编译。桌面端须使用应用自带的 CLI:

# 从 GitHub 安装
& "<安装目录>\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add github:null0xfff/dsh-bash

# 或使用 npm 包(发布后)
& "<安装目录>\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add dsh-bash

安装后在插件包目录或克隆路径中执行一次 bash 载荷 provision,并重启应用或重载 profile:

node bin/dsh-bash.mjs provision
node bin/dsh-bash.mjs status

只读检查某个 profile 的安装状态(不启动应用):

node scripts/verify-install.mjs desktop

README 记载:在临时 profile 上 dsh plugin --profile <new> add github:null0xfff/dsh-bash 后启动 web 应用,--dump-config 中应出现 # == dsh-bash → dsh-bash-shell 行,stderr 无 did not activate 警告,表示 Loader 成功激活该行。

典型用法

智能体侧调用的是插件发布的 ops_bash,而非直接绑定宿主默认 bash。相对宿主工具,常见参数差异包括 script_path(执行指定脚本路径)。具体参数表与输出 schema 与仓库内 tool-contract 测试及 manifest 声明一致;开发者在启用 deny-host-shell 后应通过 ops_bash 完成 shell 类操作,避免误调已被拒绝的宿主 shell 工具。

运维侧日常三步:

  1. plugin add 装入 profile 的 bundles
  2. node bin/dsh-bash.mjs provision(Windows 尤其需要)
  3. 重启 DSH 应用,确认工具表中出现 ops_bash

适用场景与注意

适合:只需要 dsh-ops 里 bash / sandbox / spill / job 语义、希望与 dsh-ops 并行安装、或希望减小插件依赖面(不拉 file 与 PTC 组件)的 DSH 用户与插件作者。

注意:

  • 插件以当前 DSH 进程权限运行;安装前请阅读源码、LICENSE、NOTICE 与 docs/PROVENANCE.md,确认二次开发来源(dsh-ops 0.4.1 MIT;部分文件改编自 @deepseek-ai/dsh-tool-bash 0.2.0-rc.2 MIT)符合你的合规要求。
  • Windows 受限模式依赖自构建的 bash-ipc;无 MSVC 时 status 可能显示 restricted modes: unavailable,属文档描述的预期行为。
  • SkillHub 目录为社区站点,与 DeepSeek / 幻方无官方从属关系;星标等元数据以目录页与 GitHub 为准(资料中 GitHub 星标为 0)。

结尾

dsh-bash 把 dsh-ops 的 bash 能力收成单组件插件:固定 manifest、可验证的 bash 解析与 Windows 载荷、以及与宿主 sandbox 对齐的 ops_bash。若你的场景是「只要 shell 工具、不要整包 ops」,可以从目录页了解卡片信息,并在 GitHub 查看完整 README、CI(ubuntu 上 10 个测试套件)与安装说明。

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

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

Xiaoye