OpenClaw Exec Approvals 避坑指南
- 内容介绍
- 文章标签
- 相关推荐
前提:Docker Compose 部署。路径因环境而异,按你的实际情况调整。
目录
- Exec Approvals 是什么
- 两种审批方式,各有啥问题
- 为什么配了
security=full, ask=off还是要审批 - Docker 部署的权限坑
- 配置被向导命令覆盖了怎么办
- 三种策略,选适合你的
1. Exec Approvals 是什么
OpenClaw 的 exec 工具能让 Agent 直接在宿主机上跑 shell 命令。Exec Approvals 就是给这个能力加的一道安全锁:命令执行前要人工确认。
默认行为是拒绝所有 exec,或者弹审批等你手动批准。所以很多人升级或全新部署后发现 Agent 突然"不会执行命令了",问题就在这。
2. 两种审批方式,各有啥问题
Web UI 审批
访问 http://你的gateway地址:18789,待审批的命令会出现在界面里,点 Allow / Deny 就行。
这是最稳的路径,但每次都要开浏览器切界面,在移动端或飞书场景下很麻烦。
聊天频道里直接审批
OpenClaw 支持在飞书、Telegram、Discord 等频道里用命令审批:
/approve <id> allow-once # 本次放行
/approve <id> allow-always # 加入白名单,以后不再问
/approve <id> deny # 拒绝
例如:
/approve ec81794d allow-once
但这方式有两个实际问题:
问题一:消息里经常没有审批 ID
Agent 触发审批时,有时只显示"需要审批"或者一直转圈,ID 根本不显示。这时候只能回 Web UI 找。
问题二:ID 过期后报错
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。
{
"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
"tools": {
"exec": {
"security": "full",
"ask": "off"
}
}
关键点:tools.exec.ask 必须显式写出来,不能省略。 这个字段不存在的话,gateway 会用更严格的内部默认值,导致 exec-approvals.json 里的 ask: off 完全无效。
用 CLI 设置:
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:
docker compose restart openclaw-gateway
4. Docker 部署的权限坑
容器内以 uid 1000 运行。如果 .openclaw 目录是用 root 身份创建的,容器没有写权限,exec-approvals.json 的读写会出问题。
chown -R 1000:1000 /你的路径/.openclaw
验证权限:
ls -la /你的路径/.openclaw/exec-approvals.json
# 文件所有者应该是 uid 1000 对应的用户
5. 配置被向导命令覆盖了怎么办
运行 agents add、onboard 等向导命令时,openclaw.json 会被重写,tools.exec 里的设置可能丢失。
我的做法:每次运行向导命令前先备份。
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 里配置:
{
"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 里加:
"approvals": {
"exec": {
"enabled": true,
"mode": "both",
"targets": [
{
"channel": "feishu",
"to": "你的飞书 open_id"
}
]
}
}
遇到 ID 缺失或过期的情况,回 Web UI 兜底。
最后
Exec Approvals 这套机制本身没问题,就是配置分散了点。踩完这些坑,希望能帮你省点时间。
有问题欢迎交流。
网友解答:--【壹】--:
我是今天升级后发现的。
佬,请问一下docker compose部署用的官方镜像,更新是直接pull新的镜像然后docker compose up,还是直接在当前的容器里面升级。
--【贰】--:
具体没有注意,我是昨天才发现的。
--【叁】--: Ethan Blaze:
"tools": { "exec": { "security": "full", "ask": "off" } }
我就说,我配置了exec 的security和ask 还是每次都得审批
--【肆】--:
channels中的telegram配置加上
{
“telegram”: {
“execApprovals”: {
“enabled”: true,
“approvers”: [“你的Telegram用户ID”]
}
}
}
--【伍】--:
改了还是不行
Telegram 这个会话的 elevated 权限仍未放开
• 拦截点还是:tools.elevated.allowFrom. 或 agent 层同名配置
这个也要改具体文件吗
--【陆】--:
这exec approvals是升级到3.31才有的吗?
--【柒】--:
我这边没有TG,一直用的是飞书,一直就没有研究过。
--【捌】--:
这个是默认审核的id配置吧
昨天丢给openclaw让他判断,
…
tools: {
exec: {
security: ‘full’,
ask: ‘off’,
},
},
elevated: {
enabled: true,
allowFrom: {
telegram: [‘你的tg id’],
},
},
补加了这个解决了
补充下。。。。。我还停在3.13版本没升级,3.13就是刚开始docker要审批的版本
--【玖】--:
这有点复杂,
之前小心翼翼,但却又绑手绑脚。
然后就直接让他在 host 跑了。
--【拾】--:
git pull 源码
docker compose restart openclaw-gateway
--【拾壹】--:
佬友给力,原来还要修改exec-approvals.json
--【拾贰】--:
支持老,太恶心了
--【拾叁】--:
正在糟心这个问题呢,感谢感谢
前提:Docker Compose 部署。路径因环境而异,按你的实际情况调整。
目录
- Exec Approvals 是什么
- 两种审批方式,各有啥问题
- 为什么配了
security=full, ask=off还是要审批 - Docker 部署的权限坑
- 配置被向导命令覆盖了怎么办
- 三种策略,选适合你的
1. Exec Approvals 是什么
OpenClaw 的 exec 工具能让 Agent 直接在宿主机上跑 shell 命令。Exec Approvals 就是给这个能力加的一道安全锁:命令执行前要人工确认。
默认行为是拒绝所有 exec,或者弹审批等你手动批准。所以很多人升级或全新部署后发现 Agent 突然"不会执行命令了",问题就在这。
2. 两种审批方式,各有啥问题
Web UI 审批
访问 http://你的gateway地址:18789,待审批的命令会出现在界面里,点 Allow / Deny 就行。
这是最稳的路径,但每次都要开浏览器切界面,在移动端或飞书场景下很麻烦。
聊天频道里直接审批
OpenClaw 支持在飞书、Telegram、Discord 等频道里用命令审批:
/approve <id> allow-once # 本次放行
/approve <id> allow-always # 加入白名单,以后不再问
/approve <id> deny # 拒绝
例如:
/approve ec81794d allow-once
但这方式有两个实际问题:
问题一:消息里经常没有审批 ID
Agent 触发审批时,有时只显示"需要审批"或者一直转圈,ID 根本不显示。这时候只能回 Web UI 找。
问题二:ID 过期后报错
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。
{
"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
"tools": {
"exec": {
"security": "full",
"ask": "off"
}
}
关键点:tools.exec.ask 必须显式写出来,不能省略。 这个字段不存在的话,gateway 会用更严格的内部默认值,导致 exec-approvals.json 里的 ask: off 完全无效。
用 CLI 设置:
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:
docker compose restart openclaw-gateway
4. Docker 部署的权限坑
容器内以 uid 1000 运行。如果 .openclaw 目录是用 root 身份创建的,容器没有写权限,exec-approvals.json 的读写会出问题。
chown -R 1000:1000 /你的路径/.openclaw
验证权限:
ls -la /你的路径/.openclaw/exec-approvals.json
# 文件所有者应该是 uid 1000 对应的用户
5. 配置被向导命令覆盖了怎么办
运行 agents add、onboard 等向导命令时,openclaw.json 会被重写,tools.exec 里的设置可能丢失。
我的做法:每次运行向导命令前先备份。
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 里配置:
{
"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 里加:
"approvals": {
"exec": {
"enabled": true,
"mode": "both",
"targets": [
{
"channel": "feishu",
"to": "你的飞书 open_id"
}
]
}
}
遇到 ID 缺失或过期的情况,回 Web UI 兜底。
最后
Exec Approvals 这套机制本身没问题,就是配置分散了点。踩完这些坑,希望能帮你省点时间。
有问题欢迎交流。
网友解答:--【壹】--:
我是今天升级后发现的。
佬,请问一下docker compose部署用的官方镜像,更新是直接pull新的镜像然后docker compose up,还是直接在当前的容器里面升级。
--【贰】--:
具体没有注意,我是昨天才发现的。
--【叁】--: Ethan Blaze:
"tools": { "exec": { "security": "full", "ask": "off" } }
我就说,我配置了exec 的security和ask 还是每次都得审批
--【肆】--:
channels中的telegram配置加上
{
“telegram”: {
“execApprovals”: {
“enabled”: true,
“approvers”: [“你的Telegram用户ID”]
}
}
}
--【伍】--:
改了还是不行
Telegram 这个会话的 elevated 权限仍未放开
• 拦截点还是:tools.elevated.allowFrom. 或 agent 层同名配置
这个也要改具体文件吗
--【陆】--:
这exec approvals是升级到3.31才有的吗?
--【柒】--:
我这边没有TG,一直用的是飞书,一直就没有研究过。
--【捌】--:
这个是默认审核的id配置吧
昨天丢给openclaw让他判断,
…
tools: {
exec: {
security: ‘full’,
ask: ‘off’,
},
},
elevated: {
enabled: true,
allowFrom: {
telegram: [‘你的tg id’],
},
},
补加了这个解决了
补充下。。。。。我还停在3.13版本没升级,3.13就是刚开始docker要审批的版本
--【玖】--:
这有点复杂,
之前小心翼翼,但却又绑手绑脚。
然后就直接让他在 host 跑了。
--【拾】--:
git pull 源码
docker compose restart openclaw-gateway
--【拾壹】--:
佬友给力,原来还要修改exec-approvals.json
--【拾贰】--:
支持老,太恶心了
--【拾叁】--:
正在糟心这个问题呢,感谢感谢

