1. 痛点拆解:exec 变成「全拒绝」往往不是模型坏了,而是审批链与沙箱默认一起变了
(1)cron / 子代理静默失败:2026.4.x 一类版本把工具执行与沙箱的默认策略收紧后,旧配置里常见的 security: "none" 或缺失字段会落到拒绝路径;UI 里「一切正常」但任务队列不再落盘命令输出。(2)双真源:exec-approvals.json vs openclaw.json 里的 tools.exec:社区排错里反复出现「只改了一处,另一处在启动时被覆盖」——你必须把它们当作同一门禁的两扇窗而不是两份无关配置。(3)Sandbox 容器注册表残留:升级后第一次 exec 会创建/复用容器名;若注册表与 Docker 实际状态漂移,会出现反复 recreate 失败或旧容器占用 profile。(4)远程 Mac Gateway:launchd 与交互 shell 的 OPENCLAW_* 不一致时,你在 SSH 里跑的 openclaw logs 看到的拒绝原因,可能与 Gateway 进程加载的不是同一份 JSON。
2. 症状—根因矩阵(先分层,再动刀)
| 现象 / 日志关键词 | 优先假设 | 第一动作 |
|---|---|---|
exec denied / allowlist miss / 工具调用秒拒 | tools.exec 档位、审批链或沙箱默认组合触发 deny | 只读跑 openclaw doctor;对照 tools.exec.security / ask 与 exec-approvals.json 是否同源 |
| cron 任务「成功触发」但没有副作用 | 子进程在 sandbox 内被拒绝或输出被丢弃 | 抓取同时间窗的 openclaw logs + Gateway unit 日志;用最小命令 whoami / date 做探针 |
| Docker 报错容器名冲突 / 无法 rm | sandbox 注册表与真实容器不一致 | 按「备份后清理」顺序处理容器与 ~/.openclaw/sandbox/containers.json(先读官方/发行说明再删) |
| CLI 与 Gateway 行为不一致 | 双真源环境变量 / 多个 openclaw.json 搜索路径 | 对照《Docker WS 与 Token》做 env 收敛 |
3. 落地五步走:把恢复写成可审计 Runbook
- 快照:备份
~/.openclaw、workspace、当前openclaw.json、exec-approvals.json与 sandbox 目录清单(tar或 git)。 - 冻结真源:列出 launchd / Docker / shell 中全部
OPENCLAW_*,标注谁最后写入 Gateway 进程(openclaw gateway status+ 进程环境)。 - 对齐 tools.exec:在
openclaw.json内显式设置tools.exec.security与tools.exec.ask(与团队策略一致),避免依赖隐式默认。 - 对齐 exec-approvals.json:用最小 profile 验证「单用户自建」与「多 Agent」两条路径;变更必须进工单与回滚段落。
- 沙箱与日志门禁:清理容器前做 dry-run;然后
openclaw channels probe→ 分层openclaw logs,禁止跳过 probe 直接改模型路由。
4. 可引用阈值与红线(评审向)
- 若生产环境存在两处及以上可改变
tools.exec有效档位(JSON 片段 + 未文档化 env + CI 注入),必须在上线前收敛为单一真源,否则按 P0 阻塞。 - 升级后 24 小时内必须完成一次「最小 exec 探针 + cron 一次触发」双演练,并保存各 3 行以上 logs 片段,否则视为未验收。
- 远程 Mac 上若 Gateway unit 与交互 shell 的
OPENCLAW_STATE_DIR(或等价路径变量)不一致,优先修复 supervision,再排 exec——否则你会在错误目录里改 approvals。
5. 与升级总清单、Task Brain、Docker 文的交界
问:我已经按《升级 breaking / 鉴权 v2》跑过 doctor,为什么 exec 仍全拒?因为 breaking 清单覆盖目录迁移与鉴权,而 4.x 的 exec 路径还叠加了沙箱默认与审批枚举校验;本文矩阵优先处理 tools/exec/sandbox 三层。
问:Task Brain 后还要再看 exec 吗?要。《Task Brain 安全落地》管控制面与技能策略,但真正落盘命令仍走 tools/exec;两者日志关键词不同,应分开取证。
问:Docker 部署要不要重做?不一定。先按《Docker WS 与 Token》核对网络与 token,再决定是否需要重建 sandbox 侧车。
6. FAQ:回滚、团队多机器与最小权限
问:能直接全局 ask: off 吗?单用户自建与生产多租户不是同一风险模型;若必须临时放宽,应写在限时变更单里并配自动回滚时间,而不是永久写进仓库。
问:清理 sandbox 会不会丢状态?会可能影响容器缓存与本地工件;清理前备份 workspace 与注册表 JSON,按「先停 Gateway → 再删容器 → 再删注册表条目」降低竞态。
问:官方 install 路径还要再看吗?建议对照《install.sh 与 security audit》复核暴露面,避免 exec 放宽同时把监听面放大。
7. 深度分析:为什么「升级无痛」必须包含 exec 预检
Agent 产品的连续性来自三件事:会话、记忆、可执行工具链。2026 年行业整体向默认更安全摆动,exec 与沙箱策略必然更频繁地成为升级变更点;如果只验频道与模型路由而不验 exec,团队会在周一早晨收到「助手变笨了」的体感投诉——本质是工具静默拒绝而非推理质量下降。
对远程 Mac 常驻 Gateway 的用户,exec 问题还会被系统更新与 Xcode CLT放大:shell 路径、Python/Node 前缀、Docker context 任一漂移,都可能让 sandbox 内的命令找不到二进制。把「最小 exec 探针」写进 launchd 健康检查,比事后读一小时的 logs 便宜一个数量级。
最后一层是文化:把 exec 配置与 approvals 变更视作数据库 schema 迁移一样对待——需要评审、需要回滚脚本、需要双人复核。否则你会在 Slack 里看到「谁改了一行配置让整个 cron 停了」的经典事故;这类事故的隐性成本,通常远高于租一台专用远程 Mac 做预发验证。
8. 收束:本机排通后,生产仍建议隔离 Gateway
(1)当前方案的客观限制:exec 与沙箱策略耦合多版本默认值;双真源与容器残留会让排错长尾化;笔记本与服务器混用同一 home 目录时路径假设更脆。
(2)为什么远程 Mac Gateway 往往更稳:可把预发/对照与个人开发机隔离;固定拓扑与统一 launchd 单元更易做健康探针与回滚。
(3)与 MACGPU 场景的衔接:若你希望用低门槛远程 Mac做「升级预演 + exec 探针」而不是在生产本机试刀,MACGPU 提供可租赁节点与帮助入口;下文 CTA 直达首页套餐与帮助(无需登录)。