# OpenClaw Exec Approvals 避坑指南

**URL:** <https://linux.do/t/topic/1871427>\
**Category:** 开发调优\
**Tags:** 人工智能\
**Created:** [2026 年4 月 1 日 02:30 UTC](https://linux.do/t/topic/1871427 "2026-04-01T02:30:44Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

作者： ![EthanBlaze](https://cdn.ldstatic.com/user_avatar/linux.do/ethanblaze/32/1695052_2.png) [@EthanBlaze](https://linux.do/u/EthanBlaze)\
发布日期： [2026 年4 月 1 日 02:30 UTC](https://linux.do/t/topic/1871427/1 "2026-04-01T02:30:44Z")

</div>

> 前提：Docker Compose 部署。路径因环境而异，按你的实际情况调整。

* * *

## 目录

1. Exec Approvals 是什么
2. 两种审批方式，各有啥问题
3. 为什么配了 `security=full, ask=off` 还是要审批
4. Docker 部署的权限坑
5. 配置被向导命令覆盖了怎么办
6. 三种策略，选适合你的

* * *

## 1. Exec Approvals 是什么

OpenClaw 的 `exec` 工具能让 Agent 直接在宿主机上跑 shell 命令。Exec Approvals 就是给这个能力加的一道安全锁：命令执行前要人工确认。

**默认行为是拒绝所有 exec** ，或者弹审批等你手动批准。所以很多人升级或全新部署后发现 Agent 突然"不会执行命令了"，问题就在这。

* * *

## 2. 两种审批方式，各有啥问题

### Web UI 审批

访问 `http://你的gateway地址:18789`，待审批的命令会出现在界面里，点 Allow / Deny 就行。

这是最稳的路径，但每次都要开浏览器切界面，在移动端或飞书场景下很麻烦。

### 聊天频道里直接审批

OpenClaw 支持在飞书、Telegram、Discord 等频道里用命令审批：

```auto
/approve <id> allow-once # 本次放行
/approve <id> allow-always # 加入白名单，以后不再问
/approve <id> deny # 拒绝

```

例如：

```auto
/approve ec81794d allow-once

```

**但这方式有两个实际问题：**

**问题一：消息里经常没有审批 ID**

Agent 触发审批时，有时只显示"需要审批"或者一直转圈，ID 根本不显示。这时候只能回 Web UI 找。

**问题二：ID 过期后报错**

```auto
Failed to submit approval: GatewayClientRequestError: unknown or expired approval id

```

审批 ID 有超时限制。没及时输入命令，或者 gateway 中途重启了，ID 就失效。失效后不会重新触发，得让 Agent 重新发起任务。

* * *

## 3. 为什么配了 `security=full, ask=off` 还是要审批

这是最常见的坑。原因是 OpenClaw 有 **两套独立的配置** ，必须同时设置，缺一不可。只配一套，另一套的默认值会把你设置覆盖掉。

### 第一套：`exec-approvals.json`

路径因部署方式而异。Docker Compose 部署通常在宿主机 `.openclaw` 目录下，容器内对应 `/home/node/.openclaw/exec-approvals.json`。

```json
{
  "version": 1,
  "socket": {
    "path": "/home/node/.openclaw/exec-approvals.sock",
    "token": "你的token"
  },
  "defaults": {
    "security": "full",
    "ask": "off",
    "askFallback": "full",
    "autoAllowSkills": true
  },
  "agents": {
    "main": {
      "security": "full",
      "ask": "off",
      "askFallback": "full",
      "autoAllowSkills": true
    }
  }
}

```

### 第二套：`openclaw.json` 里的 `tools.exec`

```json
"tools": {
  "exec": {
    "security": "full",
    "ask": "off"
  }
}

```

**关键点：`tools.exec.ask` 必须显式写出来，不能省略。** 这个字段不存在的话，gateway 会用更严格的内部默认值，导致 `exec-approvals.json` 里的 `ask: off` 完全无效。

用 CLI 设置：

```bash
docker compose run --rm openclaw-cli config set tools.exec.security full
docker compose run --rm openclaw-cli config set tools.exec.ask off

```

设置完重启 gateway：

```bash
docker compose restart openclaw-gateway

```

* * *

## 4. Docker 部署的权限坑

容器内以 uid 1000 运行。如果 `.openclaw` 目录是用 root 身份创建的，容器没有写权限，`exec-approvals.json` 的读写会出问题。

```bash
chown -R 1000:1000 /你的路径/.openclaw

```

验证权限：

```bash
ls -la /你的路径/.openclaw/exec-approvals.json
# 文件所有者应该是 uid 1000 对应的用户

```

* * *

## 5. 配置被向导命令覆盖了怎么办

运行 `agents add`、`onboard` 等向导命令时，`openclaw.json` 会被重写，`tools.exec` 里的设置可能丢失。

我的做法：每次运行向导命令前先备份。

```bash
cp /你的路径/.openclaw/openclaw.json \
   /你的路径/.openclaw/openclaw.json.bak.$(date +%Y%m%d%H%M%S)

```

出问题就从备份恢复，再把丢失的字段补回去。

* * *

## 6. 三种策略，选适合你的

### 策略 A：完全放行（个人私有服务器）

按第 3 节同时配好两套配置，重启 gateway。适合完全可控的个人环境。

### 策略 B：白名单放行（团队场景推荐）

常用命令自动执行，白名单之外的命令才触发审批，兼顾便利和安全。

在 `exec-approvals.json` 的 `agents.main` 里配置：

```json
{
  "security": "allowlist",
  "ask": "on-miss",
  "askFallback": "deny",
  "autoAllowSkills": true,
  "allowlist": [
    { "pattern": "/usr/bin/git" },
    { "pattern": "/usr/bin/python3" },
    { "pattern": "/usr/local/bin/node" }
  ]
}

```

### 策略 C：保留审批，但推送到飞书

不关闭审批，而是把审批请求推送到飞书，直接在飞书里用 `/approve` 处理。

在 `openclaw.json` 里加：

```json
"approvals": {
  "exec": {
    "enabled": true,
    "mode": "both",
    "targets": [
      {
        "channel": "feishu",
        "to": "你的飞书 open_id"
      }
    ]
  }
}

```

遇到 ID 缺失或过期的情况，回 Web UI 兜底。

* * *

## 最后

Exec Approvals 这套机制本身没问题，就是配置分散了点。踩完这些坑，希望能帮你省点时间。

有问题欢迎交流。

---

_[View the full topic](https://linux.do/t/topic/1871427)._
