description: "面向部署方与维护者的沙箱 Bash 执行器说明,用于选择、配置或排查受限命令执行及其拒绝与升权事实。"
English | 中文
使用 dsh-bash-sandbox 运行每条 Bash 命令,使其文件访问受到限制,而不是使用 harness 进程的完整权限。结果会报告所选模式、被拒绝的文件操作,以及 runner 是否完整实施该模式。如果没有 runner 能实施受限模式,命令会以 SANDBOX_UNAVAILABLE 失败,绝不会无隔离地运行。部署需要文件隔离时选择它;网络访问和进程可见性不在其保证范围内。
当命令不得以 harness 进程的完整文件权限运行时,用本执行器替代 dsh-bash-local。它注册为 ctx.shell,并要求一个 ctx.sandbox 提供方加上 ctx.sandboxPolicy;面向模型的 bash 工具基于它不加改动地工作,并公布 sandbox_permissions/justification 升权字段。
当部署需要为 Bash 命令提供文件级隔离时选择它:已配置的策略决定默认模式与工作区根目录,每个会话还可以通过工具的升权流程按调用使用不同模式。模式只约束文件影响——网络仍不受限制,进程可见性因后端而异。需要非隔离执行,或平台没有可用沙箱后端时,请改为挂载 dsh-bash-local。
| 模式 | 文件影响 |
|---|---|
read-only(默认) |
任何位置都不可写;在 /dev 中只有 /dev/null 节点可写,因此 >/dev/null 仍可正常工作 |
workspace-write |
只能写入策略的工作区根目录加 /tmp(bwrap 下为临时目录,Landlock 下为宿主 /tmp,Seatbelt 下为 /private/tmp 加每用户临时目录) |
danger-full-access |
不作限制;绝不咨询提供方,结果携带 sandbox: { mode, denied: false } |
本执行器自身不携带任何沙箱配置:默认模式与工作区根目录来自 ctx.sandboxPolicy,runner 选择属于 ctx.sandbox 提供方。它自己的配置就是本地执行器的旋钮,逐字继承;生成的配置目录是穷尽式真源。
- id: sandbox
name: '@deepseek-ai/dsh-sandbox-local'
- id: sandbox-policy
name: '@deepseek-ai/dsh-sandbox-policy'
config:
mode: read-only
workspaceRoot: !!js process.cwd() # fallback for calls without a session cwd
- id: bash
name: '@deepseek-ai/dsh-bash-sandbox'
被拒绝的命令会被报告,而不是静默重试:结果携带 sandbox: { mode, denied: true },面向模型的工具会追加拒绝标记。当升权可用时,模型可以用最窄的充分宽模式与一句理由重试同一条命令一次;批准提示会询问用户,未经批准绝不执行任何东西。本执行器自身绝不协商权限——覆盖值由工具层驱动。
如果没有 runner 能强制执行受限模式,前台调用以 SANDBOX_UNAVAILABLE 失败,后台进程则记录 runner 失败事实——绝不会静默无隔离运行。只有当 provider rejection 的 ENOENT/EACCES 路径或 syscall 独立指向 argv[0] 时,才把它归因于 confinement runner;其他 rejection 保持本地执行器不声明阶段的 provider-failure 语义。
当执行器约定不够用时阅读以下页面。它们从 seam 进入本执行器所消费的沙箱能力。
bash 工具及其升权面。基线是生成的 dsh-tool-bash schema。通过公布表明启用隔离的 sandboxMode 能力,此后端会为 bash 增加 sandbox_permissions(enum 为 workspace-write | danger-full-access)与 justification。策略归属方会另行贡献当前且不区分具体能力的 sandbox:policy 上下文。
在 bash 可见的请求上,schema 固定增加少量内容,另有一条由 dsh-sandbox-policy 负责的当前策略子句。
常驻策略变化会在保留的历史之后追加一份由归属方渲染的完整上下文快照,并使既有 system/history 前缀保持逐字节不变。更改执行器能力会改变 bash schema。
在普通有界输出之后,被拒绝的调用会精确追加 [sandbox: file access denied under <mode> mode]。当升权可用时,接下来精确追加 [sandbox: escalation available — retry this exact command once with sandbox_permissions (the narrowest wider mode that suffices) + justification; the approval prompt asks the user]。已结算的后台 runner 失败则追加 [sandbox: the sandbox runner itself failed under <mode> mode — the command did not run; this is a sandbox problem, not a command failure]。
除普通输出外,正常允许的运行不会增加 token。拒绝或失败会增加上述有条件标记,并保留到上下文压缩。
仅追加;新可见内容位于可复用请求前缀之后,不会使现有 KV Cache 条目失效。
如果没有 runner 能强制执行受限模式,前台调用会传播来自 sandbox seam 的 SANDBOX_UNAVAILABLE 错误。带有 ENOENT/EACCES 路径或 syscall 证据并指向 argv[0] 的 provider rejection 会把原始错误作为 runner-failure 详情;其他 rejection 保持不声明阶段的 provider error。已结算的 runner 失败以匹配到的致命 stderr 行作为详情,并保留原始 stderr 收集结果;追加的 Runner failure: <detail> 是权威诊断,优先于通用的 SANDBOX_UNAVAILABLE 前缀。
该次调用会在相应条件下显示错误文本,该文本会保留在历史记录中直到上下文压缩。
仅追加;新可见内容位于可复用请求前缀之后,不会使现有 KV Cache 条目失效。
这些限制说明本执行器何时不是通用安全边界。它们是当前包约束,不是路线图。
job_output 读取通用任务时呈现;同步抛出且指明 runner 路径的 subprocess 错误则会让 start() 立即失败。danger-full-access 有意绕过 ctx.sandbox——它是显式无约束模式,不是更宽的沙箱 profile。