执行审批
执行审批是让沙箱隔离代理在真实主机(gateway 或 node)上运行命令的配套应用 / 节点主机防护措施。一种安全互锁机制:只有在策略 + 允许列表 + (可选)用户审批达成一致时,才允许执行命令。执行审批堆叠在工具策略和提升门控之上(除非提升设置为 full,这将跳过审批)。
有关 deny、allowlist、ask、auto、full、
Codex Guardian 映射以及 ACPX harness 权限的模式优先概述,请参阅
Permission modes。
检查有效策略
Section titled “检查有效策略”| 命令 | 显示内容 |
|---|---|
openclaw approvals get / --gateway / --node <id|name|ip> | 请求的策略、主机策略源以及有效结果。 |
openclaw exec-policy show | 本地机器合并视图。 |
openclaw exec-policy set / preset | 将本地请求的策略与本地主机批准文件同步一步完成。 |
当本地范围请求 host=node 时,exec-policy show 会在运行时将该范围报告为由节点管理,而不是假装本地批准文件是事实来源。
如果配套应用 UI 不可用,任何通常会提示的请求都将由 ask fallback(默认:deny)解决。
执行批准在执行主机上本地执行:
- Gateway(网关) 主机 → 网关机器上的 Gateway(网关)
openclaw进程。 - 节点主机 → 节点运行器(macOS 配套应用或无头节点主机)。
- 经过 Gateway(网关) 身份验证的调用者是该 Gateway(网关) 的受信任操作员。
- 已配对的节点将该受信任操作员能力扩展到了节点主机上。
- Exec 批准可以降低意外执行的风险,但不是每用户身份验证边界或文件系统只读策略。
- 一旦获得批准,命令便可以根据所选主机或沙箱文件系统权限来变更文件。
- 已批准的节点主机运行绑定规范执行上下文:规范 cwd、精确 argv、env 绑定(如果存在),以及适用的固定可执行文件路径。
- 对于 Shell 脚本和直接解释器/运行时文件调用,OpenClaw 也会尝试绑定一个具体的本地文件操作数。如果该绑定文件在批准后但在执行前发生了更改,运行将被拒绝,而不会执行已更改的内容。
- 文件绑定是尽力而为的,不是每个解释器/运行时加载器路径的完整语义模型。如果批准模式无法准确识别要绑定的一个具体本地文件,它将拒绝创建基于批准的运行,而不是假装完全覆盖。
macOS 拆分
Section titled “macOS 拆分”- 节点主机服务通过本地 IPC 将
system.runmacOSIPC 转发给 macOS 应用。 - macOS 应用 执行批准并在 UI 上下文中执行命令。
批准记录位于执行主机上的本地 JSON 文件中:
~/.openclaw/exec-approvals.json架构示例:
{ "version": 1, "socket": { "path": "~/.openclaw/exec-approvals.sock", "token": "base64url-token" }, "defaults": { "security": "deny", "ask": "on-miss", "askFallback": "deny", "autoAllowSkills": false }, "agents": { "main": { "security": "allowlist", "ask": "on-miss", "askFallback": "deny", "autoAllowSkills": true, "allowlist": [ { "id": "B0C8C0B3-2C2D-4F8A-9A3C-5A4B3C2D1E0F", "pattern": "~/Projects/**/bin/rg", "source": "allow-always", "commandText": "rg -n TODO", "lastUsedAt": 1737150000000, "lastUsedCommand": "rg -n TODO", "lastResolvedPath": "/Users/user/Projects/.../bin/rg" } ] } }}策略控制旋钮
Section titled “策略控制旋钮”tools.exec.mode
Section titled “tools.exec.mode”tools.exec.mode 是主机执行的首选规范化策略界面。
取值包括:
deny- 阻止主机执行。allowlist- 无需询问仅运行允许列表中的命令。ask- 使用允许列表策略,并在未命中时询问。autoOpenClaw - 使用允许列表策略,直接运行确定性匹配,并通过 OpenClaw 的原生自动审查程序发送批准未命中项,然后再回退到人工批准路径。full- 无需批准提示即可运行主机执行。
传统的 tools.exec.security / tools.exec.ask 仍然受支持,且在较窄的会话或代理范围内设置时仍然具有优先权。
exec.security
Section titled “exec.security”exec.ask
Section titled “exec.ask”askFallback
Section titled “askFallback”deny- 阻止。allowlist- 仅当允许列表匹配时允许。full- 允许。
tools.exec.strictInlineEval
Section titled “tools.exec.strictInlineEval”严格模式可以捕获的示例:
python -cnode -e,node --eval,node -pruby -eperl -e,perl -Ephp -rlua -eosascript -e
在严格模式下,这些命令仍需要显式批准,且 allow-always 不会自动为它们保存新的允许列表条目。
tools.exec.commandHighlighting
Section titled “tools.exec.commandHighlighting”此设置 不会 更改 security、ask、允许列表匹配、
严格的内联评估行为、审批转发或命令执行。
可以在 tools.exec.commandHighlighting 下全局设置,也可以在 agents.list[].tools.exec.commandHighlighting 下按代理设置。
YOLO 模式(无需审批)
Section titled “YOLO 模式(无需审批)”如果您希望主机 exec 无需审批提示即可运行,则必须打开
两个 策略层 - OpenClaw 配置中的请求 exec 策略
(OpenClawtools.exec.*) 和 ~/.openclaw/exec-approvals.json 中的主机本地审批策略。
除非您明确收紧它,否则 YOLO 是默认的主机行为:
| 层 | YOLO 设置 |
|---|---|
tools.exec.security | gateway/node 上的 full |
tools.exec.ask | off |
主机 askFallback | full |
暴露自己的非交互式权限模式的 CLI 支持提供商可以遵循此策略。当 CLI 的有效 exec 策略为 YOLO 时,Claude OpenClaw 会添加 --permission-mode bypassPermissions。对于 OpenClaw 托管的 Claude 实时会话,OpenClaw 的有效 exec 策略优先于 Claude 的原生权限模式:YOLO 将实时启动标准化为 --permission-mode bypassPermissions,而限制性的有效 exec 策略将实时启动标准化为 --permission-mode default,即使原始 Claude 后端参数指定了另一种模式。
如果您想要更保守的设置,请将 OpenClaw exec 策略收紧回 allowlist / on-miss 或 deny。
持久化网关主机“从不提示”设置
Section titled “持久化网关主机“从不提示”设置”设置请求的配置策略
Terminal window openclaw config set tools.exec.host gatewayopenclaw config set tools.exec.security fullopenclaw config set tools.exec.ask offopenclaw gateway restart匹配主机批准文件
Terminal window openclaw approvals set --stdin <<'EOF'{version: 1,defaults: {security: "full",ask: "off",askFallback: "full"}}EOF
本地快捷方式
Section titled “本地快捷方式”openclaw exec-policy preset yolo该本地快捷方式会同时更新两者:
- 本地
tools.exec.host/security/ask。 - 本地
~/.openclaw/exec-approvals.json默认值。
它被有意设计为仅限本地。要远程更改网关主机或节点主机的批准,请使用 openclaw approvals set --gateway 或 openclaw approvals set --node <id|name|ip>。
对于节点主机,请在该节点上应用相同的批准文件:
openclaw approvals set --node <id|name|ip> --stdin <<'EOF'{ version: 1, defaults: { security: "full", ask: "off", askFallback: "full" }}EOF仅限会话的快捷方式
Section titled “仅限会话的快捷方式”/exec security=full ask=off仅更改当前会话。/elevated full是一种应急快捷方式,只有当请求的策略和主机批准文件都解析为security: "full"和ask: "off"时,它才会跳过执行批准。更严格的主机文件(例如ask: "always")仍然会提示。
如果主机批准文件比配置更严格,则更严格的主机策略仍然优先。
允许列表(每个代理)
Section titled “允许列表(每个代理)”允许列表是针对每个代理的。如果存在多个代理,请在 macOS 应用中切换您正在编辑的代理。模式是 glob 匹配。
模式可以是已解析的二进制路径 glob 或裸命令名称 glob。裸名称仅匹配通过 PATH 调用的命令,因此 rg 可以在命令为 rg 时匹配 /opt/homebrew/bin/rg,但不能匹配 ./rg 或 /tmp/rg。当您想要信任一个特定的二进制位置时,请使用路径 glob。
传统的 agents.default 条目会在加载时迁移到 agents.main。诸如 echo ok && pwd 之类的 Shell 链仍然需要每个顶层段都满足允许列表规则。
示例:
rg~/Projects/**/bin/peekaboo~/.local/bin/*/opt/homebrew/bin/rg
使用 argPattern 限制参数
Section titled “使用 argPattern 限制参数”当允许列表条目需要匹配二进制文件和特定的参数形状时,请添加 argPatternOpenClaw。OpenClaw 会根据解析后的命令参数评估正则表达式,但不包括可执行文件标记 (argv[0])。对于手动编写的条目,参数会以单个空格连接,因此如果需要精确匹配,请定位模式。
{ "version": 1, "agents": { "main": { "allowlist": [ { "pattern": "python3", "argPattern": "^safe\\.py$" } ] } }}该条目允许 python3 safe.py;而 python3 other.py 则属于允许列表未命中。如果同一二进制文件也存在仅路径的条目,未匹配的参数仍可能回退到该仅路径条目。如果目标是将二进制文件限制为声明的参数,则省略该仅路径条目。
由批准流程保存的条目可以使用内部分隔符格式进行精确 argv 匹配。建议使用 UI 或批准流程重新生成这些条目,而不是手动编辑编码值。如果 OpenClaw 无法解析命令段的 argv,则带有 OpenClawargPattern 的条目将不会匹配。
每个允许列表条目支持:
| 字段 | 含义 |
|---|---|
pattern | 解析后的二进制路径 glob 或纯命令名称 glob |
argPattern | 可选的 argv 正则表达式;省略的条目为仅路径 |
id | 用于 UI 身份的稳定 UUID |
source | 条目来源,例如 allow-always |
commandText | 批准流程创建条目时捕获的命令文本 |
lastUsedAt | 上次使用时间戳 |
lastUsedCommand | 上次匹配的命令 |
lastResolvedPath | 上次解析的二进制路径 |
自动允许技能 CLI
Section titled “自动允许技能 CLI”当启用 自动允许技能 CLI 时,已知技能引用的可执行文件将被视为节点(macOS 节点或无头节点主机)上的已允许列表条目。这通过 Gateway RPC 使用 macOSskills.binsGateway(网关)RPC 来获取技能二进制文件列表。如果您需要严格的手动允许列表,请禁用此功能。
安全二进制文件与审批转发
Section titled “安全二进制文件与审批转发”有关安全二进制文件(仅 stdin 的快速路径)、解释器绑定详细信息,以及如何将审批提示转发到 Slack/Discord/Telegram(或将它们作为原生审批客户端运行),请参阅 Exec approvals - advanced。
控制 UI 编辑
Section titled “控制 UI 编辑”使用 Control UI → Nodes → Exec approvals 卡片编辑默认值、 按代理覆盖和允许列表。选择一个范围(默认值或代理), 调整策略,添加/删除允许列表模式,然后单击 Save。UI 显示每个模式的最后使用元数据,以便您保持列表整洁。
目标选择器选择 Gateway(网关)(本地审批)或一个 Node。
节点必须通告 system.execApprovals.get/set(macOS 应用或
无头节点主机)。如果节点尚未通告 exec approvals,
请直接编辑其本地 ~/.openclaw/exec-approvals.json。
CLI: openclaw approvals 支持网关或节点编辑 - 请参阅
Approvals CLI。
当需要提示时,网关会向操作员客户端广播
exec.approval.requested。Control UI 和 macOS
应用通过 exec.approval.resolve 解析它,然后网关将
批准的请求转发到节点主机。
对于 host=node,审批请求包含一个规范 systemRunPlan
负载。网关在转发批准的 system.run
请求时,使用该计划作为权威的
命令/cwd/会话上下文。
这对于异步审批延迟很重要:
- 节点执行路径会提前准备一个规范计划。
- 审批记录存储该计划及其绑定元数据。
- 一旦批准,最终的转发
system.run调用将重用存储的计划,而不是信任后续调用者的修改。 - 如果在创建批准请求后,调用者更改了
command、rawCommand、cwd、agentId或sessionKey,网关将因批准不匹配而拒绝转发的运行。
Exec 生命周期作为系统消息呈现:
Exec running(仅当命令超过运行通知阈值时)。Exec finished。
这些内容在节点报告事件后发布到代理的会话中。被拒绝的 exec 批准对于主机命令本身是终结性的:命令不会运行。对于具有原始会话的主代理异步批准,OpenClaw 会将拒绝作为内部后续操作回发到该会话,以便代理停止等待异步命令并避免结果缺失修复。如果没有会话或无法恢复会话,OpenClaw 仍可向操作员或直接聊天路由报告简明的拒绝。子代理会话的拒绝不会回发到子代理。Gateway(网关) 托管的 exec 批准在命令完成时(以及可选地,当运行时间超过阈值时)发出相同的生命周期事件。受批准限制的 exec 在这些消息中重用批准 ID 作为 runId,以便于关联。
拒绝批准的行为
Section titled “拒绝批准的行为”当异步 exec 批准被拒绝时,OpenClaw 将主机命令视为终结性的并以故障关闭方式处理。对于主代理会话,拒绝将作为内部会话后续操作传递,告知代理异步命令未运行。这在不暴露过时命令输出的情况下保留了记录连续性。如果无法进行会话传递,当存在安全路由时,OpenClaw 将回退到简明的操作员或直接聊天拒绝。
full功能强大;请尽可能使用允许列表。ask让您随时了解情况,同时仍允许快速批准。- 每个代理的允许列表(allowlists)防止一个代理的审批泄露到其他代理。
- 审批仅适用于来自授权发送者的主机执行请求。未经授权的发送者无法发出
/exec。 /exec security=full是一种为授权操作员提供的会话级便利功能,设计上会跳过审批。若要彻底阻止主机执行,请将审批安全性设置为deny或通过工具策略拒绝exec工具。
安全二进制文件、解释器绑定以及向聊天转发审批。
Shell 命令执行工具。
紧急备用路径,同样会跳过审批。
沙箱模式和工作区访问。
安全模型和加固。
何时使用每种控制机制。
由 Skills 支持的自动允许行为。