OpenClawSkills
GitHub
工具 & 技能 • 5 分钟阅读

Exec 审批

Exec 审批、允许列表和沙箱逃逸提示

Exec 批准是伴侣应用/节点主机护栏,用于让沙盒代理运行

commands on a real host (''gateway'' or ''node''). Think of it like a safety interlock:

commands are allowed only when policy + allowlist + (optional) user approval all agree.

Exec approvals are ''in addition'' to tool policy and elevated gating (unless elevated is set to ''full'', which skips approvals).

有效策略是 ''tools.exec.*'' 和批准默认值中''更严格''的那个;如果省略了批准字段,则使用 ''tools.exec'' 值。

由 ask fallback 解析(默认:拒绝)。

Tutorial.step

适用范围

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

- ''gateway 主机'' → 网关机器上的 ''openclaw'' 进程

- node 主机 → 节点运行器(macOS 伴侣应用或无头节点主机)

macOS 分离:

- ''节点主机服务'' 通过本地 IPC 将 ''system.run'' 转发到 ''macOS 应用''。

- macOS 应用 强制执行审批并在 UI 上下文中执行命令。

Tutorial.step

设置和存储

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

''~/.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",
          "lastUsedAt": 1737150000000,
          "lastUsedCommand": "rg -n TODO",
          "lastResolvedPath": "/Users/user/Projects/.../bin/rg"
        }
      ]
    }
  }
}
Tutorial.step

策略选项

#

Tutorial.step

安全(`exec.security`)

- deny:阻止所有主机 exec 请求。

- allowlist:仅允许允许列表中的命令。

- full:允许所有内容(等同于 elevated)。

#

Tutorial.step

询问(`exec.ask`)

- off:从不提示。

- on-miss:仅当允许列表不匹配时提示。

- always:每个命令都提示。

#

Tutorial.step

询问回退(`askFallback`)

如果需要提示但无法访问 UI,回退决定:

- deny:阻止。

- allowlist:仅当允许列表匹配时允许。

- full:允许。

Tutorial.step

允许列表(按代理)

允许列表是按代理的。如果存在多个代理,在 macOS 应用中切换要编辑的代理。

模式是不区分大小写的 glob 匹配。

模式应解析为二进制路径(仅基本名称的条目会被忽略)。

旧版 ''agents.default'' 条目在加载时会迁移到 ''agents.main''。

示例:

- ''~/Projects/**/bin/bird''

- ''~/.local/bin/*''

- ''/opt/homebrew/bin/rg''

每个允许列表条目跟踪:

- id 用于 UI 标识的稳定 UUID(可选)

- 上次使用 时间戳

- 上次使用命令

- 上次解析路径

Tutorial.step

自动允许技能 CLI

当启用 自动允许技能 CLI 时,已知技能引用的可执行文件

在节点上被视为已允许(macOS 节点或无头节点主机)。这使用

''skills.bins'' 通过网关 RPC 获取技能 bin 列表。如果您想要严格的手动允许列表,请禁用此功能。

Tutorial.step

安全二进制(仅 stdin)

''tools.exec.safeBins'' 定义了一小组''仅 stdin'' 的二进制文件(例如 ''jq'')

它们可以在允许列表模式下无需显式允许列表条目运行。安全二进制拒绝

位置文件参数和类路径标记,因此它们只能对传入流进行操作。

Shell 链接和重定向在允许列表模式下不会自动允许。

当每个顶级段都满足允许列表时,Shell 链接(''&&''、''||''、'';'')是被允许的

(包括安全二进制或技能自动允许)。重定向在允许列表模式下仍然不受支持。

默认安全二进制:''jq''、''grep''、''cut''、''sort''、''uniq''、''head''、''tail''、''tr''、''wc''。

Tutorial.step

控制 UI 编辑

使用 控制 UI → 节点 → Exec 审批 卡片编辑默认值、按代理

覆盖和允许列表。选择范围(默认值或代理),调整策略,

添加/删除允许列表模式,然后保存。UI 显示每个模式的上次使用元数据

以便您保持列表整洁。

目标选择器选择网关(本地审批)或节点。节点

必须通告 ''system.execApprovals.get/set''(macOS 应用或无头节点主机)。

如果节点尚未通告 exec 审批,请直接编辑其本地

''~/.openclaw/exec-approvals.json''。

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

Tutorial.step

审批流程

当需要提示时,网关向操作员客户端广播 ''exec.approval.requested''。

控制 UI 和 macOS 应用通过 ''exec.approval.resolve'' 解析它,然后网关转发

批准的请求到节点主机。

当需要审批时,exec 工具立即返回审批 id。使用该 id

关联后续系统事件(''Exec finished'' / ''Exec denied'')。如果在超时前没有决定到达,

请求被视为审批超时并作为拒绝原因显示。

确认对话框包括:

- 命令 + 参数

- cwd

- 代理 id

- 解析的可执行路径

- 主机 + 策略元数据

操作:

- 允许一次 → 立即运行

- 始终允许 → 添加到允许列表 + 运行

- 拒绝 → 阻止

Tutorial.step

审批转发到聊天频道

您可以将 exec 审批提示转发到任何聊天频道(包括插件频道)并使用

''/approve'' 批准。这使用正常的出站传递管道。

配置:

Json5
{
  approvals: {
    exec: {
      enabled: true,
      mode: "session", // "session" | "targets" | "both"
      agentFilter: ["main"],
      sessionFilter: ["discord"], // substring or regex
      targets: [
        { channel: "slack", to: "U12345678" },
        { channel: "telegram", to: "123456789" },
      ],
    },
  },
}

在聊天中回复:

Terminal
/approve <id> allow-once
/approve <id> allow-always
/approve <id> deny

#

Tutorial.step

macOS IPC 流程

Terminal
Gateway -> Node Service (WS)
                 |  IPC (UDS + token + HMAC + TTL)
                 v
             Mac App (UI + approvals + system.run)

安全注意事项:

- Unix socket 模式 ''0600'',令牌存储在 ''exec-approvals.json'' 中。

- 同 UID 对等检查。

- 挑战/响应(nonce + HMAC 令牌 + 请求哈希)+ 短 TTL。

Tutorial.step

系统事件

Exec 生命周期作为系统消息显示:

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

- ''Exec finished''

- ''Exec denied''

这些在节点报告事件后发布到代理的会话。

网关主机 exec 审批在命令完成时发出相同的生命周期事件(以及可选地在运行超过阈值时)。

需要审批的 exec 重用审批 id 作为这些消息中的 ''runId'' 以便轻松关联。

Tutorial.step

影响

- full 很强大;尽可能使用允许列表。

- ask 让您保持参与,同时仍允许快速审批。

- 按代理的允许列表防止一个代理的审批泄漏到其他代理。

- 审批仅适用于来自''授权发送者''的主机 exec 请求。未授权的发送者无法发出 ''/exec''。

- ''/exec security=full'' 是授权操作员的会话级便利,按设计跳过审批。

要硬阻止主机 exec,请将审批安全设置为 ''deny'' 或通过工具策略拒绝 ''exec'' 工具。

相关:

- ''Exec 工具''

- ''提升模式''

- ''技能''