OpenClaw exec 写入权限问题排查与修复
问题描述
OpenClaw agent 在执行 policy-meeting-tracker 技能时,无法将分析报告文件写入 workspace 外部目录(Obsidian 笔记目录),报错信息为"执行权限限制,无法直接写入目标目录"。agent 因此放弃写入,仅输出摘要到聊天界面。
同时,通过浏览器访问 OpenClaw 网关仪表盘时出现 unauthorized: too many failed authentication attempts (retry later) 错误。
根因分析
1. 双层安全策略未配置(核心问题)
OpenClaw 从 2026.3.31 版本开始引入了 exec 工具的双层安全策略。agent 使用 exec 工具执行命令时,需要同时通过两层权限检查:
| 层级 | 配置文件 | 控制字段 | 作用 |
|------|---------|---------|------|
| Agent 侧 | ~/.openclaw/openclaw.json | tools.exec | agent 自身的执行策略声明 |
| Host 侧 | ~/.openclaw/exec-approvals.json | defaults | 主机端对执行命令的审批策略 |
两边必须同时配置为放行状态,缺一不可。
之前我们的配置:
openclaw.json 的 tools 里只有 profile: "full" 和 web 配置,没有 exec 子配置
exec-approvals.json 的 defaults 是空对象 {},默认拒绝所有执行请求
结果就是 agent 声称自己有执行权限,但实际被主机端的审批策略拦住了。
2. Gateway 重启超时导致进程残留
多次使用 openclaw gateway restart 都超时(60s health check timeout),旧进程未被正确终止就尝试启动新进程,造成端口冲突和认证状态异常。
3. 认证尝试次数锁定
在 Gateway 异常状态下反复尝试连接仪表盘,触发了防暴力破解机制,导致 IP 被临时锁定。
修复步骤
第一步:配置 Host 侧审批策略
编辑 ~/.openclaw/exec-approvals.json:
{
"version": 1,
"socket": {
"path": "<USER_HOME>/.openclaw/exec-approvals.sock",
"token": "*** 已隐藏 ***"
},
"defaults": {
"security": "full",
"ask": "off"
},
"agents": {}
}
关键改动:defaults 从 {} 改为 { "security": "full", "ask": "off" }
字段含义:
security: "full" — 允许执行所有命令
ask: "off" — 无需人工批准(自动化场景必需)
第二步:配置 Agent 侧执行策略
编辑 ~/.openclaw/openclaw.json,在 tools 中添加 exec 配置:
"tools": {
"profile": "full",
"exec": {
"security": "full",
"ask": "off"
},
"web": {
"search": { "enabled": true },
"fetch": { "enabled": true }
}
}
第三步:彻底重启 Gateway
由于 gateway restart 经常超时,需要手动清理后重新启动:
# 1. 找到占用端口的进程 PID
netstat -ano | findstr ":18789" | findstr "LISTENING"
# 2. 强制终止
taskkill /PID <PID> /F
# 3. 等待端口释放
Start-Sleep -Seconds 2
# 4. 确认端口已释放
netstat -ano | findstr ":18789" | findstr "LISTENING"
# (应无输出)
# 5. 启动新实例
openclaw gateway start
# 6. 验证启动成功
openclaw gateway status
# 应显示 RPC probe: ok
验证结果
修复后 OpenClaw agent 可以正常使用 exec 工具写入 workspace 外部文件(如 Obsidian 笔记目录),仪表盘连接恢复正常。
相关问题记录
Cron isolated 模式 Bug
修复过程中还发现一个独立问题:OpenClaw 2026.4.5 版本的 cron 任务使用 --session isolated 模式时全部报 pairing required,即使传入 token 也无法解决。这是 isolated 模式创建新 WebSocket 连接时未使用 token 进行握手的 bug。
当前替代方案:使用 WorkBuddy 自动化(automation-3)代替 OpenClaw cron 调度政策会议追踪任务。
参考来源
安全提醒
将 exec 权限设置为 "security": "full" + "ask": "off" 意味着 agent 可以无限制执行任意系统命令。此配置仅适用于本地可信环境。如果后续需要限制 agent 的执行能力,可以:
- 将
security 改为 "sandboxed" 或 "restricted"
- 在
exec-approvals.json 的 agents 字段中针对特定 agent 设置不同权限级别
- 通过
allowedCommands 白名单限制可执行的命令范围