1. 升级完 OpenClaw 2026.3.31,我的 exec 突然不干活了
如果你刚把 OpenClaw 升到 2026.3.31,然后发现原本跑得好好的 Cron 任务、心跳 Agent、自动化脚本集体罢工,日志里反复刷exec approval required、exec denied、approval required这类字样,那你不是一个人。这个版本把执行工具(exec tool)的安全策略收紧了一层,很多老配置在新版本里只改了一半,结果就是命令请求发出去了,但主机侧根本不批。
先说清楚这篇适合谁:正在用 OpenClaw 跑自动化流程、被 2026.3.31 的授权报错卡住、想快速把 exec 恢复成可执行状态的人。核心检索词就三个——OpenClaw、授权报错、exec 被拒,围绕openclaw.json和exec-approvals.json两个文件展开。
我踩过的坑是这样的:升级后第一反应是去openclaw.json里把tools.exec.security改成full、ask改成off,改完重启,结果ls、echo这种最普通的命令还是被拦。当时以为是 Gateway 没重启干净,反复 stop/start 了三四次,日志翻到底才发现问题根本不在 Agent 侧,而在主机侧还有一道独立的审批策略在把关。OpenClaw 从 2026.3.31 开始采用双层策略模型,只放开一层等于没放开。
理解这个双层机制是排查的关键。你可以把它想成两道门:第一道门在 Agent 侧,由~/.openclaw/openclaw.json里的tools.exec控制,决定 Agent 能"请求"执行什么;第二道门在 Host 侧,由~/.openclaw/exec-approvals.json控制,是主机端真正执行前的最终把关,而且它作为上限存在——哪怕 Agent 侧写的是full,只要 Host 侧还是默认的allowlist或者ask: on-miss,命令照样弹批准提示或者直接被拒。两层同时放开且语义一致,exec 才能真正无限制运行。这个设计本身是合理的,安全边界放在主机侧更稳妥,只是升级文档没把"要改两个文件"这件事讲得足够显眼。
下面按"先配好前置、再复制配置、然后验证、最后排障"的顺序走一遍,每一步都给可复制的骨架和检查动作。
2. 动手前的前置准备:确认版本、路径与备份
在改任何配置之前,先把环境摸清楚,避免改错文件或者改完发现版本对不上。
第一步,确认 OpenClaw 版本确实是 2026.3.31 或更高。低版本没有这套双层策略,照本文改反而可能引入不认识的字段。
openclaw --version输出里应该能看到2026.3.31这样的版本号。如果低于这个版本,先升级再谈配置。
第二步,确认配置目录。Linux 和 macOS 默认都在~/.openclaw/下,两个关键文件是:
ls -la ~/.openclaw/openclaw.json ls -la ~/.openclaw/exec-approvals.jsonopenclaw.json一般升级后已存在;exec-approvals.json很可能压根不存在,这是正常的,需要你手动新建。Windows 用户的路径不在~下,通常在用户目录的.openclaw文件夹里,具体以官方文档为准,本文命令以 Linux/macOS 为准。
第三步,备份整个配置目录。这一步别省,改坏了能一键回滚。
cp -r ~/.openclaw ~/.openclaw.bak.$(date +%Y%m%d)备份完再动手,心里踏实。接下来进入配置环节。
3. 可复制配置:openclaw.json 与 exec-approvals.json 双层骨架
这一节是全文的核心,两个文件都要改,缺一不可。
3.1 Agent 侧:openclaw.json 的 tools.exec 配置
打开~/.openclaw/openclaw.json,找到tools下面的exec配置块。如果已经有tools但里面没有exec,就新增;如果tools下还有profile等其他子项,合并保留,别整个覆盖掉。
{ "tools": { "exec": { "security": "full", "ask": "off" } } }这里用 JSON5 格式写,好处是支持注释,方便你标注哪一行是为什么改的。security: "full"表示 Agent 侧允许请求所有命令执行;ask: "off"表示 Agent 侧不再主动发起人工批准询问。注意这只是第一道门。
3.2 Host 侧:exec-approvals.json 的 defaults 配置
如果~/.openclaw/exec-approvals.json不存在,直接新建。这个文件的结构和 Agent 侧不一样,它有一个defaults块,作用于所有未单独指定的 Agent。
{ "version": 1, "defaults": { "security": "full", "ask": "off" }, "agents": { // 需要针对特定 Agent 做更精细控制时在这里加,例如: // "your-agent-name": { // "security": "full", // "ask": "off" // } } }defaults里的security: "full"表示主机侧允许所有命令执行,ask: "off"表示无需人工批准。这两个值必须和 Agent 侧保持一致,否则 Host 侧会作为更严格的上限把请求拦下来。agents块留空即可,除非你有某个 Agent 需要单独收紧或放开。
两个文件都改完后,用表格对照一下两层的关键字段,确认没有写反:
| 层级 | 文件 | 关键字段 | 本文取值 | 作用 |
|---|---|---|---|---|
| Agent 侧 | openclaw.json | tools.exec.security | full | Agent 能请求什么 |
| Agent 侧 | openclaw.json | tools.exec.ask | off | 是否主动询问批准 |
| Host 侧 | exec-approvals.json | defaults.security | full | 主机实际执行上限 |
| Host 侧 | exec-approvals.json | defaults.ask | off | 是否需人工批准 |
注意:Host 侧是上限。哪怕 Agent 侧写了
full,Host 侧只要还是allowlist或ask: on-miss,exec 依然会被拦。这是 2026.3.31 最容易踩的坑。
3.3 重启 Gateway 让配置生效
改完文件不重启,配置不会加载。完整重启命令:
openclaw gateway stop && openclaw gateway start更简洁的推荐写法:
openclaw gateway restart重启后确认状态:
openclaw gateway status状态里应该显示 Gateway 正常运行、没有配置解析报错。如果这里就报错,多半是 JSON 语法问题,先回去检查两个文件的括号和逗号。
4. 验证 exec 是否恢复:从单条命令到自动化流程
配置生效后,别急着上生产任务,先用最小成本验证。
先跑一条最简单的命令,确认 exec 通道打通:
openclaw exec "echo exec-ok"如果返回exec-ok且没有任何 approval 提示,说明双层策略已经放开。接着测文件读写和 Git 操作这类真实场景会用到的命令:
openclaw exec "ls -la ~/.openclaw" openclaw exec "git status"再回到你真正关心的场景——Cron 定时任务、心跳(heartbeat)Agent、自动化脚本。触发一次原本会报exec approval errors的流程,观察日志里是否还有approval required字样。正常情况下这些提示应该完全消失,命令直接执行。
验证时可以顺手看一眼 Gateway 日志,确认没有残留的拒绝记录:
openclaw gateway logs如果日志里 exec 相关条目显示的是执行成功而不是 denied,那这一轮修复就算完成了。
5. 本篇常见错排查:改完还报错的六种情况
即使按上面走了一遍,仍可能遇到 exec 被拒。下面按出现频率排一下。
第一种,只改了openclaw.json,没建exec-approvals.json。这是最高频的原因,Host 侧用默认策略把请求拦了。检查文件是否存在:
cat ~/.openclaw/exec-approvals.json文件不存在就按 3.2 节新建。
第二种,两个文件都改了但值不一致。比如 Agent 侧full、Host 侧还是allowlist。逐字段对照 3.2 节的表格,确保security和ask两层一致。
第三种,JSON 语法错误导致配置没加载。JSON5 虽然支持注释,但括号、逗号写错照样解析失败。用诊断命令快速定位:
openclaw doctordoctor会把配置解析问题、路径问题一并列出来,比人肉翻文件快。
第四种,Gateway 没重启成功。openclaw gateway status如果显示的还是旧进程或者异常状态,配置不会生效。重新执行openclaw gateway restart,再确认状态。
第五种,改错了文件路径。Windows 用户尤其容易踩,~/.openclaw/在 Windows 上不是这个路径。确认你编辑的是 OpenClaw 实际读取的目录,可以用openclaw doctor输出的路径为准。
第六种,针对特定 Agent 的覆盖规则在起作用。如果你在exec-approvals.json的agents块里给某个 Agent 单独设了更严格的策略,那defaults对它不生效。检查agents块里有没有你正在测试的 Agent 名字。
排查顺序建议:先openclaw doctor看全局诊断,再cat两个文件确认内容,最后openclaw gateway logs看运行时拒绝原因。三步走下来基本能定位。
安全提醒:把
security设为full、ask设为off会大幅提升权限,等于让 Agent 在主机上无限制执行命令。请只在可信的本地或私有环境中这么配,并确保机器本身有防火墙等基础防护。生产环境如果不需要全自动,建议保留ask的批准环节,只放开必要的命令范围。
6. 授权链路打通后,把模型接入也顺手理一遍
exec 恢复之后,OpenClaw 的自动化能力就回来了,但 Agent 真正干活还得靠底层模型稳定输出。如果你在排查授权的同时也想把模型调用链路一起理顺,可以走 TaoToken 的接入方式:模型对话入口适合先验证模型响应是否正常,API Keys 页面用来生成和管理调用凭证,接入文档里有各语言的请求示例,长期跑编码类 Agent 的话 Coding Plan 更划算。
具体入口:
- 模型对话验证:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model_chat
- API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api_keys
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc
- Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding_plan
- 控制台:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=console
- API 基址(不加 UTM):https://taotoken.net/api
配置时把 API Key 填进 OpenClaw 对应的模型 provider 配置里,基址用上面的 API 地址,先跑一条最小请求确认连通,再交给 Agent 去执行任务。授权链路和模型链路都通了,整套自动化才算真正跑起来。