Skip to content

Exec 审批是 OpenClaw 的安全联锁机制,控制沙箱 agent 在真实宿主机(gateway 或 node)上运行命令。有效策略取 tools.exec.* 和宿主机本地 ~/.openclaw/exec-approvals.json 的严格者。默认 YOLO 模式 (security=full, ask=off) 不提示;如需审批可用 openclaw approvals get 查看生效策略,并通过 allowlist 或 ask 设置收紧。

Exec 审批

Exec 审批是伴随应用 / 节点宿主机的安全联锁,让沙箱 agent 在真实宿主机(gatewaynode)上运行命令前须经过审批把关。命令只有当策略 + allowlist + (可选的)用户审批全部同意时才被允许。Exec 审批是工具策略和提升权限限制之外的额外保障(除非提升权限设为 full,则跳过审批)。

::: note 有效策略取 tools.exec.* 和审批默认值两者的严格者;如果审批字段未设置,使用 tools.exec 的值。宿主机本地也会使用该机器上的审批状态——在 ~/.openclaw/exec-approvals.json 中本地配置的 ask: "always" 会保持持续提示,即使会话或配置默认要求 ask: "on-miss"。 :::

检查有效策略

命令说明
openclaw approvals get / --gateway / --node <id|name|ip>查看所请求的策略、宿主机策略来源及最终生效结果。
openclaw exec-policy show查看本地机器合并后的视图。
openclaw exec-policy set / preset一步同步本地请求策略与本地宿主机审批文件。

当本地作用域请求 host=node 时,exec-policy show 会将该作用域报告为运行时由节点管理,而不是假装本地审批文件是真实来源。

如果伴随应用 UI 不可用,任何需要提示的请求都由询问回退(默认:deny)解决。

TIP

原生聊天审批客户端可以在待审批消息上提供频道特有的交互快捷方式。例如,Matrix 可以嵌入表情反应快捷键( 允许一次、 拒绝、♾️ 始终允许),同时保留 /approve ... 命令作为回退。

适用范围

Exec 审批在执行宿主机本地强制执行:

  • Gateway 宿主机 → gateway 机器上的 openclaw 进程。
  • 节点宿主机 → 节点运行器(macOS 伴随应用或无头节点宿主机)。

信任模型

  • Gateway 认证的调用者是该 Gateway 的受信任操作员。
  • 配对的节点将该受信任操作员的能力扩展到节点宿主机上。
  • Exec 审批降低意外执行风险,但不是每用户的认证边界或文件系统只读策略。
  • 一旦批准,命令可以根据所选宿主机或沙箱文件系统权限变更文件。
  • 已批准的节点宿主机运行绑定规范执行上下文:规范 cwd、精确 argv、存在时的环境绑定以及可能时的固定可执行路径。
  • 对于 shell 脚本和直接解释器/运行时文件调用,OpenClaw 也会尝试绑定一个具体的本地文件操作数。若该绑定文件在审批后但执行前发生变更,运行将被拒绝,而不是执行已漂移的内容。
  • 文件绑定是尽力而为的,不是每种解释器/运行时加载器路径的完整语义模型。如果审批模式无法精确识别一个具体的本地文件来绑定,它会拒绝创建审批支持的运行,而不是假装提供了完整覆盖。

macOS 分层

  • 节点宿主机服务通过本地 IPC 将 system.run 转发到 macOS 应用
  • macOS 应用强制执行审批并在 UI 上下文中执行命令。

设置与存储

审批保存在执行宿主机上的本地 JSON 文件中:

text
~/.openclaw/exec-approvals.json

示例结构:

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"
        }
      ]
    }
  }
}

策略选项

exec.security

  • deny:阻止所有宿主机 exec 请求。
  • allowlist:只允许 allowlist 中的命令。
  • full:允许一切(相当于提升权限)。

exec.ask

  • off:从不提示。
  • on-miss:仅在 allowlist 不匹配时提示。
  • always:每次命令都提示。allow-always 持久信任在有效询问模式为 always不会抑制提示。

askFallback

需要提示但无 UI 可达时的回退决策:

  • deny:阻止。
  • allowlist:只有 allowlist 匹配时允许。
  • full:允许。

tools.exec.strictInlineEval

true 时,OpenClaw 将内联代码执行形式视为仅审批,即使解释器二进制文件本身已在 allowlist 中。纵深防御,适用于不能简洁映射到单个稳定文件操作数的解释器加载器。

严格模式捕获的示例:

  • python -c
  • node -enode --evalnode -p
  • ruby -e
  • perl -eperl -E
  • php -r
  • lua -e
  • osascript -e

严格模式下这些命令仍需显式审批,allow-always 不会自动为它们持久化新的 allowlist 条目。

tools.exec.commandHighlighting

类型:boolean,默认 false。仅控制 exec 审批提示中的命令文本显示效果。启用后,OpenClaw 可以附加解析器派生的命令片段,使 Web 审批提示能高亮命令 token。此设置改变 securityask、allowlist 匹配、严格内联 eval 行为、审批转发或命令执行。可在全局 tools.exec.commandHighlighting 或每个 agent 下 agents.list[].tools.exec.commandHighlighting 设置。

YOLO 模式(无审批)

要让宿主机 exec 无审批提示直接运行,必须同时开放两层策略:

  • OpenClaw 配置中的 exec 策略(tools.exec.*
  • ~/.openclaw/exec-approvals.json 中的宿主机本地审批策略

YOLO 是 gateway + node 的默认宿主机行为(除非你主动收紧):

层级YOLO 设置
tools.exec.securityfull on gateway/node
tools.exec.askoff
宿主机 askFallbackfull

重要区别

  • tools.exec.host=auto 决定 exec 在哪里运行:有沙箱时在沙箱,否则在 gateway。
  • YOLO 决定宿主机 exec 如何被审批:security=full + ask=off
  • YOLO 模式下,OpenClaw 不会在配置的宿主机 exec 策略之上再添加额外的启发式命令混淆审批门或脚本预检拒绝层。
  • auto 不会让 gateway 路由成为沙箱会话的免费覆盖。从 auto 可以允许每次调用的 host=node 请求;host=gateway 仅在无沙箱运行时才允许从 auto 内部发出。如需稳定的非自动默认值,设置 tools.exec.host 或使用 /exec host=... 显式指定。

CLI 驱动的后端 provider 如果暴露了自己的非交互权限模式,可以遵循此策略。Claude CLI 在 OpenClaw 申请的 exec 策略为 YOLO 时会添加 --permission-mode bypassPermissions。可在 agents.defaults.cliBackends.claude-cli.args / resumeArgs 中显式覆盖后端行为,例如 --permission-mode defaultacceptEditsbypassPermissions

如需更保守的配置,可将任意一层收紧为 allowlist / on-missdeny

持久化 gateway 宿主机“永不提示”配置

设置所请求的配置策略

```bash
openclaw config set tools.exec.host gateway
openclaw config set tools.exec.security full
openclaw config set tools.exec.ask off
openclaw gateway restart
```

匹配宿主机审批文件

```bash
openclaw approvals set --stdin <<'EOF'
{
  version: 1,
  defaults: {
    security: "full",
    ask: "off",
    askFallback: "full"
  }
}
EOF
```

本地快捷方式

bash
openclaw exec-policy preset yolo

此快捷方式更新本地 tools.exec.host/security/ask 和本地 ~/.openclaw/exec-approvals.json 默认值。只影响本地。要远程更改 gateway 宿主机或节点宿主机上的审批,使用 openclaw approvals set --gatewayopenclaw approvals set --node <id|name|ip>

节点宿主机

在节点上应用相同的审批文件:

bash
openclaw approvals set --node <id|name|ip> --stdin <<'EOF'
{
  version: 1,
  defaults: {
    security: "full",
    ask: "off",
    askFallback: "full"
  }
}
EOF

::: note 本地限制

  • openclaw exec-policy 不会同步节点审批。
  • openclaw exec-policy set --host node 会被拒绝。
  • 节点 exec 审批在运行时从节点获取,因此节点目标更新必须使用 openclaw approvals --node ...。 :::

仅会话快捷方式

  • /exec security=full ask=off 只改变当前会话。
  • /elevated full 是紧急快捷方式,也会为该会话跳过 exec 审批。

如果宿主机审批文件比配置更严格,更严格的宿主机策略仍然优先。

Allowlist(每个 agent)

Allowlist 是每个 agent 独立的。如果有多个 agent,在 macOS 应用中切换要编辑的 agent。模式是 glob 匹配。

模式可以是解析后的二进制路径 glob,也可以是裸命令名 glob。裸命令名只匹配通过 PATH 调用的命令,因此 rg 可以匹配 /opt/homebrew/bin/rg(当命令为 rg 时),但匹配 ./rg/tmp/rg。当你想信任某个特定二进制位置时,使用路径 glob。

旧版 agents.default 条目在加载时迁移到 agents.main。Shell 链(如 echo ok && pwd)仍然需要每个顶层段都满足 allowlist 规则。

示例如下:

  • rg
  • ~/Projects/**/bin/peekaboo
  • ~/.local/bin/*
  • /opt/homebrew/bin/rg

使用 argPattern 限制参数

在 allowlist 条目中添加 argPattern 可以匹配二进制和特定参数形状。OpenClaw 将正则表达式评估为解析后的命令参数(排除可执行 token argv[0])。对于手工编辑的条目,参数用单个空格连接,因此需要精确匹配时请锚定模式。

json
{
  "version": 1,
  "agents": {
    "main": {
      "allowlist": [
        {
          "pattern": "python3",
          "argPattern": "^safe\\.py$"
        }
      ]
    }
  }
}

此条目允许 python3 safe.pypython3 other.py 是 allowlist 不匹配。如果同一个二进制也有一个仅路径条目,不匹配的参数仍可回退到该仅路径条目。当目标是限制该二进制到声明的参数时,请省略仅路径条目。

由审批流保存的条目可以使用内部分隔符格式进行精确 argv 匹配。更推荐使用 UI 或审批流重新生成这些条目,而不是手工编辑编码后的值。如果 OpenClaw 无法解析某个命令片段的 argv,带有 argPattern 的条目不会匹配。

每个 allowlist 条目支持以下字段:

字段说明
pattern解析后的二进制路径 glob 或裸命令名 glob
argPattern可选 argv 正则表达式;省略则为仅路径匹配
id用于 UI 标识的稳定 UUID
source条目来源,如 allow-always
commandText创建条目时捕获的命令文本
lastUsedAt上次使用的时间戳
lastUsedCommand上次匹配的命令
lastResolvedPath上次解析的二进制路径

自动允许技能 CLI

启用自动允许技能 CLI后,已知技能引用的可执行文件在节点(macOS 节点或无头节点宿主机)上被视为 allowlist 条目。这通过 skills.bins 经由 Gateway RPC 获取技能二进制列表。如需严格的手动 allowlist,请禁用此功能。

WARNING

  • 这是隐式的便利 allowlist,与手动路径 allowlist 条目分开。
  • 适用于 Gateway 和节点在同一信任边界的受信任操作员环境。
  • 如需严格的显式信任,保持 autoAllowSkills: false 并只使用手动路径 allowlist 条目。

Safe bins 和审批转发

关于 safe bins(仅 stdin 快速路径)、解释器绑定细节以及如何将审批提示转发到 Slack/Discord/Telegram(或作为原生审批客户端运行),请参见 Exec approvals - advanced

控制 UI 编辑

使用控制 UI → 节点 → Exec 审批卡片编辑默认值、每个 agent 的覆盖和 allowlist。选择作用域(默认值或某个 agent),调整策略,添加/删除 allowlist 模式,然后保存。UI 显示每个模式的上次使用元数据,方便维护。

目标选择器选择 Gateway(本地审批)或节点。节点必须声明 system.execApprovals.get/set(macOS 应用或无头节点宿主机)。如果节点尚未声明 exec 审批,直接编辑其本地 ~/.openclaw/exec-approvals.json

CLI:openclaw approvals 支持 gateway 或节点编辑——参见 审批 CLI

审批流程

需要提示时,gateway 向操作员客户端广播 exec.approval.requested。控制 UI 和 macOS 应用通过 exec.approval.resolve 解决,然后 gateway 将批准的请求转发给节点宿主机。

对于 host=node,审批请求包含规范的 systemRunPlan 载荷。Gateway 在转发已批准的 system.run 请求时使用该计划作为权威的命令/cwd/会话上下文。

异步审批延迟的关键机制:

  • 节点 exec 路径预先准备一个规范计划。
  • 审批记录存储该计划及其绑定元数据。
  • 一旦批准,最终转发的 system.run 调用重用存储的计划,而不是信任后续调用方的编辑。
  • 如果调用方在审批请求创建后更改了 commandrawCommandcwdagentIdsessionKey,gateway 将以审批不匹配为由拒绝转发的运行。

系统事件

Exec 生命周期以系统消息形式呈现:

  • Exec running(仅当命令超过运行通知阈值时)
  • Exec finished

这些消息在节点报告事件后发布到 agent 的会话。被拒绝的 exec 审批是终端性的:OpenClaw 可以向操作员或直接聊天路由报告拒绝,但不会将 Exec denied 发回 agent 会话或唤醒 agent 工作。Gateway 宿主机 exec 审批在命令完成后(以及可选地运行时间超过阈值时)也会发出相同的生命周期事件。审批门控的 exec 使用审批 id 作为这些消息中的 runId,便于关联。

被拒绝审批的行为

当异步 exec 审批被拒绝时,OpenClaw 将该请求视为终端。它可以向操作员或直接聊天路由显示简洁的拒绝信息,但不会向 agent 会话发送拒绝指引。这样可以防止被拒绝的命令变成另一个模型轮次,并防止 agent 重用同一命令之前的运行输出。

影响

  • full 权限很强大;尽可能优先使用 allowlist。
  • ask 让你保持对审批的掌控,同时仍允许快速审批。
  • 每个 agent 的 allowlist 防止一个 agent 的审批泄漏到其他 agent。
  • 审批只适用于来自授权发送者的宿主机 exec 请求。未授权发送者无法发出 /exec
  • /exec security=full 是授权操作员的会话级便利,设计上跳过审批。要硬性阻止宿主机 exec,将审批安全模式设为 deny 或通过工具策略拒绝 exec 工具。

常见问题

如何配置 YOLO 无提示模式?

使用 openclaw exec-policy preset yolo 可一步设置本地 YOLO 模式。它会同时更新 tools.exec.* 配置和 ~/.openclaw/exec-approvals.json。对于 gateway 或节点远程设置,使用 openclaw approvals set --gateway--node 并指定 security=full, ask=off

gateway 和 node 上的 exec 默认会提示审批吗?

不会。默认行为是 YOLO 模式(security=fullask=off),exec 直接运行无需提示。如果你需要审批或 allowlist,必须同时收紧 tools.exec.* 配置宿主机本地审批文件中的策略。两层策略以严格者优先。

allowlist 中的模式如何匹配可执行文件?

模式可以是解析后的二进制路径 glob(如 ~/Projects/**/bin/peekaboo)或裸命令名 glob(如 rg)。裸命令名只匹配通过 PATH 调用的命令;路径 glob 可以指定特定位置。每个顶层命令链段都必须满足 allowlist 规则(如 echo ok && pwd 需要 echopwd 都允许)。