跳转至

Exec 审批

Exec 审批是配套应用 / 节点主机的护栏,用于让沙箱化代理在真实主机(gateway 或 node)上运行命令。只有当策略 + 允许列表 +(可选)用户审批三者一致时,命令才会运行。审批叠加在工具策略和提权门控之上。Gateway 的完整会话(full-session)路径和符合条件的提权完整(elevated-full)路径可以跳过主机审批评估。请参阅 严格 inline-eval 例外。

如需以模式为主的概述,了解 deny、allowlist、ask、auto、full、Codex Guardian 映射和 ACPX harness 权限,请参阅 权限模式。

Note

除下面描述的完整权限 Gateway 会话例外之外,有效策略取 tools.exec.* 与审批默认值中的更严格者:审批只会收紧配置派生的安全/ask 设置,绝不会放宽它们。如果某个审批字段被省略,则使用 tools.exec 的值。主机 exec 还使用该机器上的本地审批状态——执行主机审批文档中的主机本地 ask: "always" 会持续提示,即使会话或配置默认值请求 ask: "on-miss"。未配置的节点使用与 Gateway 相同的 full / off 基线。节点执行在调度前仍会检查目标策略:调用方的 allowlist / off 会拒绝不匹配的命令,而目标的 ask: "always" 即使调用方请求 full / off 也要求审批。

适用位置

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

  • Gateway 主机 -> 网关机器上的 openclaw 进程。
  • 节点主机 -> 节点运行器(macOS 配套应用或无头节点主机)。

当 ask: "on-miss" 时,claude-cli 后端还会将原生 Bash 命令与代理的 exec 允许列表进行核对。这会在 Claude Code 拥有执行权的同时授权命令参数。它不提供 OpenClaw 沙箱化。有关匹配、提示和绑定限制,请参阅 原生 Bash 与 exec 允许列表。

信任模型

  • 经过 Gateway 认证的调用方被视为该 Gateway 的可信操作者。
  • 已配对的节点将该可信操作者能力扩展到节点主机上。
  • 审批可降低意外执行风险,但不是按用户划分的认证边界,也不是文件系统只读策略。
  • 一旦获批,命令即可根据所选主机或沙箱文件系统权限修改文件。
  • 获批的节点主机运行会绑定规范执行上下文:cwd、精确 argv、存在时的环境变量绑定,以及适用时的固定可执行文件路径。
  • 受 Gateway 审批支持的命令会在审查前绑定每个已解析的命令段可执行文件,并在启动前重新检查。节点主机在本地策略评估期间捕获这些身份,并在调度前重新检查。这不涵盖远程人工审批等待期间出现的内部 shell 可执行文件。受保护的可执行文件仅使用解析后的真实路径身份。可写可执行文件还使用内容哈希。在绑定窗口内解析发生变化(包括 PATH 中更早出现的新可执行文件)会拒绝运行。仅身份绑定会保留原本符合条件的 allow-always 决定。请参阅 解释器/运行时命令。
  • 对于 shell 脚本和直接的解释器/运行时文件调用,OpenClaw 还会尝试绑定一个具体的本地文件操作数。如果该文件在审批后、执行前发生变化,运行将被拒绝,而不是执行已漂移的内容。
  • 文件绑定是尽力而为的,并非对每个解释器/运行时加载路径的完整模型。如果无法准确识别出唯一一个具体的本地文件,OpenClaw 会拒绝生成审批支持下的运行,而不是假装完全覆盖。

macOS 拆分

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

检查有效策略

命令 说明
openclaw approvals get / --gateway / --node <id\|name\|ip> 请求的策略、主机策略来源和有效结果。
openclaw exec-policy show 终端工具策略和本地命令审批;添加 --session <key> 可预览会话工具。
openclaw exec-policy set / preset 一步将本地请求策略与本地主机审批文档同步。

Note

不包含按会话的 /exec 覆盖项。请在相关会话中运行 /exec 以查看其当前默认值。请参阅 会话覆盖。

工具可用性与命令审批是分开的:即使审批允许命令,messaging 工具配置文件也可以排除 exec 和 process。exec-policy show 可离线解释本地排除项,并标识策略来源。--session <key> 可从已保存的会话设置中预览工具。包含并不保证执行,缺失也不证明工具已被禁用。请在实际运行中验证执行;命令审批仍然适用。使用 --agent <id> 选择代理,使用 --verbose 查看所有审批范围。

完整 CLI 参考(标志、JSON 输出、允许列表的添加/移除):审批 CLI。

当本地范围请求 host=node 时,exec-policy show 会在运行时将该范围报告为节点管理(node-managed),而不是将本地审批文件视为事实来源。

如果配套应用 UI 不可用,任何通常会提示的请求都会由 ask 回退(默认:deny)解析。

Tip

原生聊天审批客户端可以在待审批消息上植入特定于频道的操作提示。 Matrix 会植入表情回应快捷方式(✅ 允许一次,♾️ 始终允许, ❌ 拒绝),同时仍在消息中保留 /approve ... 作为后备方式。

对于原生聊天审批界面,节点 exec 会在发起该工具调用的回合中等待决策, 并在那里返回命令输出。关闭或取消该回合会使待定的授权失效。迟到的审批无法 重新启动该执行。类型为 SYSTEM_RUN_DENIED 的结果表示节点拒绝了执行, 而不是命令可能已经运行。

设置与存储

审批记录存放在执行主机上的共享 SQLite 状态数据库中。当设置了 OPENCLAW_STATE_DIR 时,数据库随该状态目录存放。否则使用默认的 OpenClaw 状态目录:

$OPENCLAW_STATE_DIR/state/openclaw.sqlite#exec_approvals_config
# otherwise
~/.openclaw/state/openclaw.sqlite#exec_approvals_config

#exec_approvals_config 后缀是单例 SQLite 行的显示定位符,不属于数据库 文件名的一部分。该行将下面显示的 JSON 文档保存为其权威值,因此 CLI 和 Gateway 的比较并交换(compare-and-swap)哈希保持稳定。

默认审批套接字也遵循同一根目录:$OPENCLAW_STATE_DIR/exec-approvals.sock; 当变量未设置时,为 ~/.openclaw/exec-approvals.sock。

状态目录是相互独立的信任范围。当 OPENCLAW_STATE_DIR 指向其他位置时, OpenClaw 绝不会从默认状态目录导入或归档审批。请为自定义状态目录单独配置 审批。如果当前状态目录中仍包含旧版 exec-approvals.json,请停止 Gateway 并运行一次 openclaw doctor --fix 以将其导入。Doctor 也只会导入属于当前 状态目录的旧版 plugin-binding-approvals.json。

旧版允许列表条目中的 lastUsedAt 或 lastUsedCommand 可能为 null。 Doctor 在导入期间会将这两个使用字段视为不存在,即使配置仍需修复也是如此。 这并不会放宽规范策略验证:其他格式错误的字段或冲突的旧版策略仍会保留以供 操作者恢复,并且 exec 审批会保持阻塞,直到旧版文件得到解决。修复后,请使用 相同的状态目录,通过 openclaw approvals get 进行验证。

示例 schema:

{
  "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": "~/path/to/**/bin/rg",
          "argPattern": "sha256:argv:...",
          "source": "allow-always",
          "lastUsedAt": 1737150000000,
          "lastResolvedPath": "/Users/user/Projects/.../bin/rg"
        },
        {
          "pattern": "~/path/to/**/bin/git"
        }
      ],
      "mcpTools": [
        {
          "server": "project-docs",
          "tool": "publish_page",
          "source": "allow-always",
          "addedAt": 1737150000000
        }
      ]
    }
  }
}

策略开关

tools.exec.mode

tools.exec.mode 是主机 exec 的首选规范化策略接口:

值 行为
deny 阻止主机 exec。
allowlist 仅运行允许列表中的命令,不进行询问。
ask 使用允许列表策略,并在未命中时询问。
auto 直接运行确定性的允许列表匹配项;对符合审查条件的未命中项,使用 allow(允许一次)、deny(将原因返回给智能体)或 ask(人工审批)进行审查。
full 在不需要常规策略提示的情况下运行主机 exec;请参阅下面的严格内联求值行为。

Doctor 会将受支持的旧版 tools.exec.security / tools.exec.ask 组合迁移为 tools.exec.mode。如果部署脚本、模板或配置生成器仍发送旧字段,config patch 和 Gateway 的 config.patch 会拒绝混合策略,且不修改文件。请在错误所指出的 同一 exec 对象中更新该来源,包括用于智能体覆盖的 agents.entries.<agentId>.tools.exec。当存在完全等价的 mode 值时,将 security / ask 替换为建议的 mode 值。例如,security: "full", ask: "off" 变为 mode: "full"。

不完整的组合在转换前需要明确选择预期策略。带有 ask: "always" 或 security: "full", ask: "on-miss" 的组合没有完全等价的 mode:请保留这两个 旧字段,并从同一对象中移除 mode 以保持其策略。替换对象时,请保留其他 exec 设置。对于仍需要迁移的已保存文件,请运行 openclaw doctor --fix。再次运行它 不会更新过期的部署来源。

exec.security

security "deny" | "allowlist" | "full" (path)
  • deny - 阻止所有主机 exec 请求。
  • allowlist - 仅允许已加入允许列表的命令。
  • full - 不需要允许列表匹配。这不会授予提升的访问权限。
    Default is `full` for gateway/node hosts. A `sandbox` host defaults to
    `deny` instead.

### `exec.ask` {#execask}

`ask` *"off" | "on-miss" | "always"* (path)
:   主机 exec 的已配置 ask 策略。控制来自 `tools.exec.mode` 与主机审批默认值的基线审批提示行为。默认值为 `off`。每次调用的 `ask` 工具参数(参见 [Exec 工具](exec.md#parameters))只能强化该基线;当有效主机 ask 为 `off` 时,渠道来源的模型调用会忽略它。

    - `off` - 无普通策略提示。单独启用的严格内联求值检查仍可能需要审批。
    - `on-miss` - 仅当允许列表不匹配时提示。
    - `always` - 每条命令都提示。当有效 ask 模式为 `always` 时,`allow-always` 持久信任**不会**抑制提示。

### `askFallback` {#askfallback}

`askFallback` *"deny" | "allowlist" | "full"* (path)
:   当需要提示但无法访问任何 UI(或提示超时)时的处理方式。省略时默认为 `deny`。

    - `deny` - 阻止。
    - `allowlist` - 仅当允许列表匹配时允许。
    - `full` - 不对当前安全策略添加更严格的回退限制。允许列表限制和显式审批要求(如可识别的严格内联求值形式)仍然适用。

### `tools.exec.strictInlineEval` {#toolsexecstrictinlineeval}

`strictInlineEval` *boolean* (path) default: `false`
:   当普通主机审批评估运行时,`true` 将可识别的内联代码求值形式视为仅限审批,包括在普通 `full`/`off` 策略下或使用已列入允许列表的解释器二进制文件时。这是为无法干净映射到单一稳定文件操作数的解释器加载器提供的纵深防御。

严格模式可捕获的示例:`python -c`、`node -e`/`--eval`/`-p`、`ruby -e`、`perl -e`/`-E`、`php -r`、`lua -e`、`osascript -e`(还包括 `awk`、`sed`、`make`、`find -exec` 和 `xargs` 的内联形式)。

在该审批路径上,这些命令需要审查者或显式审批。当 `tools.exec.mode: "auto"` 时,符合条件的命令会收到 `allow`、`deny` 或 `ask` 判定。审查者可以授予一次低风险或中风险执行,向智能体返回拒绝原因,或询问人类。网关命令必须通过可变文件绑定检查,但不需要带有固定路径的渲染命令即可接收审查。POSIX 登录或交互式 shell 包装器会跳过审查者,并在绑定成功时要求人类审批,因为其隐式启动文件位于操作数绑定之外。现有的绑定拒绝(包括交互式代码加载形式)仍然被拒绝。有关绑定限制和升级,请参阅 [Exec 模式](exec.md#modes)。`Codex app-server` 命令审批若进入审查者回退,则询问人类,因为其审批请求不暴露可强制执行的已解析可执行文件。`allow-always` 不会为内联求值命令持久化新的允许列表条目。

单独配置 `tools.exec.mode: "full"` 并不能绕过此设置。在网关上,具有有效安全级别 `full` 和 ask `off` 的全权限会话会跳过主机审批评估。当 exec 和主机审批策略均允许 `full`/`off` 时,允许的提升式 full 执行也会跳过它。这些路径会跳过严格内联求值检测。仅通过 ask 收紧 full 会话会恢复审批路径,同时保留其主机文件下限例外。请参阅 [内联求值](exec.md#inline-eval-strictinlineeval)。

### `tools.exec.commandHighlighting` {#toolsexeccommandhighlighting}

`commandHighlighting` *boolean* (path) default: `false`
:   仅用于展示:启用后,OpenClaw 可能会附加由解析器派生的命令跨度,以便 Web 审批提示可以高亮命令令牌。**不会**更改 `security`、`ask`、允许列表匹配、严格内联求值行为、审批转发或命令执行。

在 `tools.exec.commandHighlighting` 下全局设置,或在 `agents.entries.*.tools.exec.commandHighlighting` 下按代理设置。

## YOLO 模式(无需审批) {#yolo-mode-no-approval}

要在没有审批提示的情况下运行主机 exec,请开启**两个**策略层:OpenClaw 配置(`tools.exec.*`)中请求的 exec 策略,以及执行主机审批文档中的主机本地审批策略。

要以无提示的普通 full 模式执行可识别的内联求值形式,请保持 `tools.exec.strictInlineEval` 未设置或将其设为 `false`(默认值)。如果检测在启用严格模式的情况下运行,`askFallback: "full"` 不会取代审查者或显式审批。上述网关会话和提升式例外会跳过该检测。

省略的 `askFallback` 默认为 `deny`。当无 UI 的审批提示应回退为允许时,请显式将主机 `askFallback` 设置为 `full`。

| 层 | YOLO 设置 |
| --- | --- |
| `tools.exec.mode` | 在 `gateway`/`node` 上为 `full` |
| 主机 `askFallback` | `full` |

!!! warning

    **重要区别:**

    - `tools.exec.host=auto` 选择 exec 在**哪里**运行:可用时使用沙盒,否则使用网关。
    - YOLO 选择主机 exec 如何获得审批:`security=full` 加上 `ask=off`。
    - YOLO **不会**在已配置的主机 exec 策略之上额外增加独立的启发式命令混淆审批门或脚本预检拒绝层。节点准备仍会读取目标策略,并解析一次工作目录。如果双方都允许 full/off 且禁用了严格内联求值,则普通路径别名和内联脚本不需要审批绑定。限制性策略和后续策略更改仍然强制执行。
    - `auto` 并不会让 node 或 gateway 路由成为沙盒会话中的自由覆盖。仅当没有沙盒运行时处于活动状态时,才允许从 `auto` 发出的每次调用 `host=node` 和 `host=gateway` 请求。要获得稳定的非 auto 默认值,请设置 `tools.exec.host` 或显式使用 `/exec host=...`。

对于 OpenClaw 管理的 Claude 会话,OpenClaw 会以其 `default` 权限模式启动 Claude Code。OpenClaw 的有效 exec 策略通过原生工具钩子和权限请求保持权威,包括 YOLO 和限制性策略,即使原始 Claude 后端参数请求了 `bypassPermissions`。

如果你希望采用更保守的配置,请将 OpenClaw exec 策略收紧回 allowlist / on-miss 或 deny。

持久化网关主机“永不提示”设置

1. 设置所需的配置策略

openclaw config set tools.exec.host gateway
openclaw config set tools.exec.mode full
openclaw config set tools.exec.strictInlineEval false
openclaw gateway restart

2. 匹配主机审批文档

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

本地快捷方式

openclaw exec-policy preset yolo

同时更新本地 tools.exec.host/security/ask 和本地审批 文件默认值(包括 askFallback: "full")。它被有意 设计为仅本地生效。若要远程更改网关主机或节点主机审批,请使用 openclaw approvals set --gateway 或 openclaw approvals set --node <id|name|ip>。

其他内置预设:cautious(host=gateway、security=allowlist、 ask=on-miss、askFallback=deny)和 deny-all(host=gateway、 security=deny、ask=off、askFallback=deny)。以相同方式应用: openclaw exec-policy preset cautious。

若要设置单个字段而不是完整预设,请使用 openclaw exec-policy set --host <auto|sandbox|gateway|node> --security <deny|allowlist|full> --ask <off|on-miss|always> --ask-fallback <deny|allowlist|full>,并指定这些标志中的任意子集。

节点主机

改为在节点上应用相同的审批文档:

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 get --node <id|name|ip> 检查它们,并使用 openclaw approvals set --node <id|name|ip> --file <path>(或 --stdin)替换它们;参见 审批 CLI。

会话和轮次快捷方式

  • /exec security=full ask=off <task> 仅请求对当前消息使用该策略。请在同一消息中包含任务。单独的指令不会影响下一条消息。会话权限模式和主机策略仍可能限制该请求。
  • /elevated full 是一个紧急例外快捷方式,仅当请求的策略和主机审批文档都解析为 security: "full" 且 ask: "off" 时,才会跳过 exec 审批。更严格的主机文件,例如 ask: "always",仍会提示。

在完全权限 Gateway 会话例外之外,如果主机审批 文档仍比配置更严格,则更严格的主机策略仍然优先。

允许列表(按代理)

允许列表是按代理的。如果存在多个代理,请在 macOS 应用中切换 你正在编辑的代理。模式是 glob 匹配。

模式可以是已解析的二进制路径 glob 或裸命令名称 glob。 裸名称仅匹配通过 PATH 调用的命令,因此当命令是 rg 时,rg 可以匹配 /opt/homebrew/bin/rg,但不匹配 ./rg 或 /tmp/rg。请使用路径 glob 来信任某个特定二进制位置。

旧版 agents.default 条目会在加载时迁移到 agents.main。 像 echo ok && pwd 这样的 Shell 链仍然需要每个顶层段 都满足允许列表规则。

示例:

  • rg
  • ~/path/to/**/bin/peekaboo
  • ~/.local/bin/*
  • /opt/homebrew/bin/rg

使用 argPattern 限制参数

当允许列表条目需要匹配某个二进制文件和 特定参数形状时,请添加 argPattern。OpenClaw 在所有主机上使用 ECMAScript(JavaScript)正则 表达式语义,并将表达式应用于解析后的命令参数,排除可执行文件 token(argv[0])。 对于手工编写的条目,参数会用单个空格连接,因此 在需要精确匹配时,请为模式添加锚点。

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

该条目允许 python3 safe.py。python3 other.py 是允许列表 未命中。如果同一二进制文件也存在仅路径条目,未匹配的 参数仍可能回退到该仅路径条目。如果目标是限制二进制文件只能使用已声明的参数,请省略仅路径 条目。

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

生成的 allow-always 条目会绑定到精确 argv 以及你批准它们时的工作 目录。选择始终在此处允许仅授权 在同一目录中运行相同命令。在其他位置运行属于允许列表未命中。

在 2026.8.1 之前保存的生成条目不绑定目录,升级后 处于非活动状态。openclaw update 会在其自动 Doctor 检查期间移除它们, 或者你可以自行运行 openclaw doctor --fix。重新运行受影响的工作流并 选择始终在此处允许以创建替代条目。手动允许列表规则 不会被更改。对于手动仅路径规则,请同时省略 source 和 argPattern。

每个允许列表条目支持:

字段 含义
pattern 已解析的二进制路径 glob 或裸命令名称 glob
argPattern ECMAScript argv 正则表达式或生成的精确 argv 哈希;省略表示仅路径
id 稳定的不透明 ID;缺失时生成为 UUID
source 生成条目来源,例如 allow-always;手动条目请省略
字段 含义
commandText 旧版纯文本输入;加载时丢弃
lastUsedAt 最近使用时间戳
lastUsedCommand 最近匹配的命令;为生成的哈希 argv 条目省略
lastResolvedPath 最近解析的二进制路径

MCP 工具授权

对于由 Gateway 托管的 Codex 运行,始终允许 可以为 mcp.servers 中配置的服务器上的一个 MCP 工具保存一个持久授权。Gateway 会将该授权写入同一审批文档中的 agents.<agentId>.mcpTools。它覆盖确切的 agent、已配置的服务器名称和工具名称,并且适用于任意参数。它不会授予对其他 agent、服务器或工具的访问权限。

每个条目包含 server、tool、source: "allow-always" 和 addedAt(Unix 毫秒)。lastUsedAt 可选。Codex 应用、原生插件服务器和 computer-use 服务器不会接收 OpenClaw MCP 工具授权。OpenClaw 仅在提供持久化存储且能够明确地将审批匹配到某个活跃的 Gateway 拥有的工具调用时才会签发授权。如果关联缺失或存在歧义,则保留 Codex 现有的原生/会话行为。

当服务器的 codex.defaultToolsApprovalMode 为 auto 或未指定时,授权生效。显式 prompt 优先于已存储的授权,并继续询问。显式 approve 已经绕过逐次调用审批。参见 Codex 工具审批。

持久授权会在 OpenClaw 下次准备 Codex 线程配置和 hook 注册时读取,例如新会话或重启后。当前会话继续使用 Codex 记住的决策。OpenClaw 不会为每个工具调用重新加载授权。

要检查授权,请运行 openclaw approvals get --gateway。要撤销其中一个,请导出文档,从 agents.<agentId>.mcpTools 中删除其条目,并使用现有的 set 命令替换文档:

openclaw approvals get --gateway --json | jq '.file' > approvals.json
# Edit approvals.json, preserving other settings, allowlists, and grants.
openclaw approvals set --gateway --file approvals.json

从这两个命令中省略 --gateway 即可编辑本地审批。撤销也会在下次线程准备/注册时生效。开始新会话或重启以丢弃活动会话记住的审批。如果 Codex 还在其原生配置中持久化了单独的审批,也请在那里删除该原生授权。

自动化的常设授权

由 gateway-host 自动化(cron)运行引发的审批仅会发送到已连接的 exec 审批客户端:Control UI、macOS/iOS/Android 应用,以及声明了 approvals 或 exec-approvals 能力的 API 客户端。TUI 不会渲染 exec 审批卡片,聊天频道也永远不会接收自动化审批,否则每次发生都会重复一张卡片。当审阅者界面已连接时,计划运行会像交互式运行一样等待决策。自动化是单飞行的,因此每个任务同一时间最多只有一张卡片处于待处理状态。如果没有连接审批界面,请求会立即被拒绝,并且运行的错误信息会说明策略修复方法。Node-host 自动化 exec 保持完全无头策略(无卡片),直到 node 执行拥有自己的常设授权路径。

当审批源自自动化的隔离运行时,使用 始终允许 解决它不会写入 JSON 允许列表条目。相反,Gateway 会签发一个范围受限的常设授权,绑定到确切的 agent、自动化、任务配置和操作(命令文本、工作目录和请求的环境)。在授权有效期间,同一任务的后续发生会执行该确切操作而不再提示。审批卡片会提前说明这一点:自动化审批包含一行范围描述,准确说明始终允许将签发什么。

授权覆盖范围及何时停止

当任务被删除或其实质性定义发生变化时,授权会以失败关闭方式回退到普通提示,即使后续编辑恢复了先前的定义。暂停并重新启用未更改的自动化会保留授权。当命令、工作目录或环境即使相差一个字节,或授权被撤销或过期,或原始审批记录消失时,授权也会停止匹配。检查在进程派生之前立即运行,因此中途发生的撤销或任务编辑仍然优先。可变文件操作数以及需要显式审查的命令(heredocs、严格内联 eval、审计抑制)会按每次发生继续提示。非自动化审批保持不变。

授权生命周期

默认情况下,授权会保留直到撤销 —— 这与产品其他位置中始终允许的含义相同。条款在签发时冻结,且不会追溯更改:

  • tools.exec.grantExpiryDays(默认未设置)为 未来 授权设置以天为单位的默认有效期。现有授权保留其签发时的条款。使用撤销可提前使其失效。这是面向需要定期重新审批的受管部署的机群策略配置项。
  • 解决界面可以通过 approval.resolve / exec.approval.resolve 上的 grantExpiresInDays 字段,或 openclaw approvals resolve <id> allow-always --expires-in-days <n>,按授权覆盖默认值。覆盖值优先于配置默认值。
  • 过期授权会回退到提示,并会被机会性地清理。

列出和撤销

每个常设授权都可见且可撤销:

  • Control UI:设置 → 审批显示常设授权台账 —— 自动化、确切命令、使用次数和状态(直到撤销、N 天后过期、已过期、已撤销)—— 每个活动行都有一个撤销操作。
  • CLI:openclaw approvals grants list 渲染相同台账。openclaw approvals grants revoke <grant-id> 撤销一个授权。撤销是幂等的,并在下一次发生的派生边界生效 —— 该次发生会再次提示。
  • 删除或实质性编辑自动化,或撤销签发审批,也会使授权失效,而无需触及授权界面。暂停并重新启用未更改的自动化则不会。

铸造 operator_approvals 行仍然是唯一的授权所有者:授权是一种派生关联,每次使用时都会对照实时审批行、自动化行和撤销状态重新验证。

自动允许技能 CLI

当启用 自动允许技能 CLI(autoAllowSkills)时,已知技能引用的可执行文件在节点(macOS 节点或无头节点主机)上会被视为已加入允许列表。此功能通过网关 RPC 使用 skills.bins 获取技能 bin 列表。如果你希望使用严格的手动允许列表,请禁用此功能。

技能信任属于提供它的网关。切换网关会使之前的缓存失效,包括 Mac 应用的受信任二进制列表以及仍在进行中的审批检查。刷新失败可以保留来自同一网关的最后已知信任。它不能导入另一个网关的信任。

Mac 的执行审批面板会在所选网关连接时刷新其受信任二进制和代理选择。本地策略、所选范围以及未完成的允许列表编辑会保留在 Mac 上。

Warning

  • 这是一个隐式便捷允许列表,与手动路径允许列表条目分开。
  • 它适用于网关和节点处于同一信任边界的受信任操作员环境。
  • 如果你需要严格的显式信任,请保持 autoAllowSkills: false,并且仅使用手动路径允许列表条目。

安全 bins 与审批转发

关于安全 bins(仅 stdin 快速路径)、解释器绑定详情,以及如何将审批提示转发到 Slack/Discord/Telegram(或将其作为原生审批客户端运行),请参阅 执行审批 - 高级。

控制 UI 编辑

使用 控制 UI -> 节点 -> 执行审批 卡片来编辑默认值、按代理覆盖和允许列表。选择一个范围(默认值或某个代理),调整策略,添加/移除允许列表模式,然后 保存。UI 会显示每个模式的最后使用元数据,以便你保持列表整洁。

目标选择器选择 网关(本地审批)或 节点。节点必须通告 system.execApprovals.get/set(macOS 应用或无头节点主机)。如果某个节点尚未通告执行审批,请直接编辑其本地审批文档。

一些节点主机(包括 Windows 伴侣应用)拥有不同的审批策略格式。控制 UI 以只读方式显示这些主机原生策略。使用伴侣应用或 openclaw approvals set --node <id|name|ip> 配合原生策略结构来编辑它们。请参阅 审批 CLI。

CLI:openclaw approvals 支持网关或节点编辑 - 请参阅 审批 CLI。

审批流程

当需要审批提示时,网关会向操作员客户端广播 exec.approval.requested。控制 UI 和 macOS 应用通过 exec.approval.resolve 处理它,然后网关将已批准的请求转发到节点主机。

macOS 审批面板会保持普通命令紧凑,将提供的代理和主机放在一个摘要中。它在完整、换行的命令下方显示工作目录。较长的命令可以滚动。展开 详细信息 以查看可执行文件路径。目录和可执行文件路径仍完全可选择。复制 会复制显示的命令,包括用于控制字符和不可见字符的可见转义。主机来自请求。网关或节点可以位于显示该面板的 Mac 的远程位置。

选择 仅允许一次 或按 Command-Return 以批准一次执行。仅按 Return 不会批准。Escape 会关闭面板,当 不允许 可用时拒绝请求。否则它会在没有决定的情况下关闭。在此始终允许 仅在请求策略允许持久批准时出现。

对于 host=node,审批请求包含一个规范的 systemRunPlan 负载。网关在转发已批准的 system.run 请求时,会将该计划作为权威的 command/cwd/session 上下文:

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

审批范围摘要

审批所有者可以附加一个类型化、仅用于显示的范围,用于描述操作的影响范围。OpenClaw 会在频道审批卡片上渲染经过净化的摘要,并将有界范围包含在可供控制 UI 客户端使用的安全审批展示中。范围从不授予授权或更改审批策略。

  • message-send:目标、接收者数量、可选的接收者预览,以及受众是内部还是外部。
  • payment:精确的小数金额、货币,以及收款方或支付系统。
  • external-post:目标,以及帖子是公开还是受限。

例如,邮件审批可能显示 Send to 3 recipients via email (external): alice@example.com, bob@example.com, +1 more。所有者提供这些事实。频道绝不会从命令或消息文本中推断它们。如果没有声明范围,审批卡片将完全按之前方式渲染。

系统事件与拒绝

当审批可以送达时,普通代理运行会等待决定,并在同一轮中接收执行结果。最终回复使用原始投递路径,包括传入的 A2A 任务。操作员拒绝会返回被拒绝的工具结果,而不运行命令。

显式使用异步执行的诊断和导出命令保留其独立的后续投递。对于这些工作流:

执行生命周期会在节点报告完成后,向代理会话发布一条 Exec finished 系统消息。OpenClaw 还可以在审批授予后,在 tools.exec.approvalRunningNoticeMs 经过后发出一次进行中的通知(默认 10000,0 禁用它)。被拒绝的执行审批对主机命令是终结性的:命令不会运行。

  • 对于具有源会话的主代理异步审批,OpenClaw 会将拒绝作为内部后续消息发回该会话,以便代理停止等待异步命令并避免缺失结果修复。
  • 如果没有会话或会话无法恢复,OpenClaw 仍可向操作员或直接聊天路由报告简洁的拒绝。
  • 子代理和 cron 会话的拒绝不会发回该会话。

网关主机 exec 审批会发出相同的完成生命周期事件。 受审批控制的 exec 会复用审批 ID,以将待处理请求与其完成/拒绝消息关联起来(Exec finished (gateway id=...) / Exec denied (gateway id=...))。

影响

  • full 功能强大。尽可能优先使用允许列表。
  • ask 让你保持知情,同时仍允许快速审批。
  • 每个代理的允许列表可防止一个代理的审批泄漏到其他代理。
  • 审批仅适用于来自授权发送者的主机 exec 请求。未授权发送者无法发出 /exec。
  • /exec security=full <task> 是授权操作员在当前回合发出的请求,受有效会话和主机策略约束。若要硬性阻止 exec,请通过工具策略拒绝 exec 工具。有关主机审批下限的全访问会话例外,请参阅 会话覆盖。

exec 审批 - 高级

安全二进制文件、解释器绑定以及将审批转发到聊天。

exec 工具

Shell 命令执行工具。

提升模式

也会跳过审批的紧急处理路径。

沙箱化

沙箱模式和工作区访问。

安全

安全模型和加固。

沙箱 vs 工具策略 vs 提升

何时使用每种控制。

技能

基于技能的自动允许行为。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw