在 OpenClaw 排障里,approval-timeout 很容易让人误以为 Linux 终端或 sudo 出了问题,但这次案例的入口在 Telegram:用户让 OpenClaw 执行补 ClamAV 病毒库、启用自动更新等系统级命令,先遇到 elevated is not available right now / Failing gates: allowFrom,放行来源后又变成 Approval required / approval-timeout。本文按排障视角拆开两层门控,同时把模型通道的 TaoToken 接法交代清楚。TaoToken 官网:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。注意,TaoToken 只负责 OpenClaw 的模型调用认证和 Token 消耗,不参与 elevated、审批或系统命令执行;提权门控仍看 ~/.openclaw/openclaw.json 里的 allowFrom 与 exec ask。
一、原问题与场景:Telegram 里 OpenClaw 执行系统命令,先撞 allowFrom,再撞 approval-timeout
这次问题不是“OpenClaw 完全不能提权”,而是提权链路被拆成了多层:模型会话可以正常聊天,不代表系统级命令就能落地。场景很典型:你在 Telegram 私聊里让 OpenClaw 做本地运维,比如更新 ClamAV 病毒库、启用 clamav-freshclam 自动更新服务。此时 OpenClaw 先返回 elevated is not available right now,并提示 Failing gates: allowFrom。这个阶段说明 Telegram 来源还没有进入 elevated 白名单。
按第一层思路放行 Telegram 后,报错会变化:不再是 allowFrom,而是 Approval required 和 approval-timeout。很多人到这里会误以为服务器没响应,或者 Linux 终端里应该出现类似 sudo 的审批提示。实际上,这里的审批发生在 OpenClaw 自身的 exec 工具层,不在 Linux shell 层。也就是说,Telegram 会话已经把命令交给 OpenClaw,但 OpenClaw 的 exec 仍处在 ask / approval 模式,远程场景下没有直观审批入口,最终就表现为超时失败。
所以要解决这个问题,必须同时处理两层:第一层是 ~/.openclaw/openclaw.json 中 tools.elevated.allowFrom.telegram 是否放行;第二层是 tools.exec.security 与 tools.exec.ask 是否仍然卡审批。只改一层,通常只能把报错从 allowFrom 换成 approval-timeout,看起来像“又坏了”,其实只是卡在了下一道门。
二、TaoToken 前置:只负责 OpenClaw 模型通道,不碰提权门控
OpenClaw 的会话要消耗 Token,因此在做提权排障之前,建议先把模型通道配通。配模型认证、填 Key 时,可以去 TaoToken 官网创建 Key:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。模型 Base URL 填 https://taotoken.net/api,注意不要带 /v1,也不要给 API 地址加 UTM;Key 用控制台创建的 YOUR_API_KEY。具体字段以 OpenClaw 当前版本的模型认证配置向导或配置项为准。
这里必须把边界说清楚:TaoToken 只出现在模型通道。它不参与 elevated 判断,不参与 exec 审批,也不会替你执行 freshclam、systemctl 或任何系统命令。换句话说,模型通道通不通,和本地提权能不能成功是两条链路。提权门控仍然按原文逻辑查 allowFrom 与 exec ask。你可以先用 OpenClaw 普通对话确认模型 Key 已生效,再回到 Telegram 验证系统命令是否真正以 root 身份执行。
如果你在 TaoToken 这边还没拿到 Key,可以先看 API Keys 页面;接入字段和示例以接入文档为准。建议把模型通道和提权配置分开验证,避免把 401、模型不可用、Base URL 填错这类问题误判成 OpenClaw 提权失败。
三、可复制配置:~/.openclaw/openclaw.json 放行 Telegram 并调整 exec ask
核心配置文件是 ~/.openclaw/openclaw.json。下面只展示与本次排障相关的 tools 节点,实际使用时请合并到你的现有配置中,不要直接覆盖整个文件。重点是把 Telegram 来源加入 elevated 白名单,并把 exec 的 ask 策略调整为 off。
{ "tools": { "elevated": { "enabled": true, "allowFrom": { "telegram": ["123456789"] } }, "exec": { "security": "full", "ask": "off" } } }字段含义很直接:
- tools.elevated.enabled 控制 elevated 模式是否可用。
- tools.elevated.allowFrom.telegram 控制哪些 Telegram 来源可以进入 elevated 链路。
- tools.exec.security = full 表示 exec 采用更宽松的执行策略。
- tools.exec.ask = off 表示 exec 不再因为审批而卡住。
allowFrom 里建议填实际的 Telegram 数字 ID,不要直接把*长期写进去。*意味着所有能触达该 bot 的 Telegram 来源都可能进入 elevated 白名单,安全风险很高。如果是多人或多个群,应该只保留确实需要放行的 ID。改完配置后,根据你的启动方式重载或重启 OpenClaw,让新配置生效。
模型通道这边可以按下面字段理解:
Base URL: https://taotoken.net/api API Key: YOUR_API_KEY Model ID: 以控制台可用模型为准再次强调:Base URL 不要写成 https://taotoken.net/api/v1,也不要给 https://taotoken.net/api 追加 UTM 参数。API 地址保持干净,Key 用 YOUR_API_KEY 替换。
四、验证请求与成功结果:elevated 执行 id,freshclam,systemctl enable --now clamav-freshclam
配置改完后不要只看文件,要做实测。第一步先验证模型通道:在 Telegram 里给 OpenClaw 发一条普通消息,例如“请只回复 model-ok”。如果它能正常回复,说明模型认证、Base URL、Key 和 Token 消耗这条链路基本可用。如果这里失败,优先检查 Key 是否还是 YOUR_API_KEY、Base URL 是否误加了 /v1 或 UTM、模型 ID 是否可用。
第二步验证提权链路。通过 elevated 模式执行 id,观察返回结果:
id期望结果应接近:
uid=0(root) gid=0(root) groups=0(root)如果这里已经不是普通用户,而是 uid=0(root),说明 Telegram 来源已经通过 elevated 白名单,exec 也没有继续卡在审批。接着执行原始场景里的系统级命令:
freshclam systemctl enable --now clamav-freshclam systemctl status clamav-freshclam --no-pager成功时,freshclam 会下载并生成病毒库文件。可以检查:
ls -1 /var/lib/clamav通常应能看到类似:
main.cvd daily.cvd bytecode.cvd同时,clamav-freshclam 服务应处于 enabled 且 active (running)。如果 freshclam 成功但服务仍是 disabled/inactive,说明只完成了病毒库下载,没有把自动更新服务启用起来,需要继续执行 systemctl enable --now clamav-freshclam。
五、本篇常见错排查:allowFrom、exec.ask、approval-timeout 与终端误区
这类问题最容易卡在几个固定误区上。
第一,只加 allowFrom,不改 exec ask。结果是 elevated is not available right now 消失,但马上变成 Approval required / approval-timeout。因为 allowFrom 只解决“来源是否有资格提权”,exec ask 才决定“命令是否还要审批”。
第二,allowFrom.telegram 填错。Telegram 用户名、显示名、私聊 ID、群组 ID、bot ID 不是一回事。配置文件里应使用实际数字 ID,而不是 @ 开头的用户名。填错后表面看已经放行,实际仍会被 allowFrom 门控拦住。
第三,以为 Linux 终端没有 sudo 提示就是服务器没响应。Telegram 里出现 Approval required 时,Linux 服务器终端本来就不一定出现交互提示。审批在 OpenClaw exec 层,不在 shell 层。排查时不要只在终端里找弹窗。
第四,把 TaoToken Key 当成提权开关。TaoToken 只负责模型通道,模型能聊天不代表 elevated 已放行,也不代表 exec ask 已关闭。反过来,提权配置正确也不代表模型 Key 一定可用,两者要分开测。
第五,Base URL 填错。OpenClaw 模型认证里 Base URL 应填 https://taotoken.net/api,不要带 /v1,不要加 UTM。API 地址加参数、加路径、加尾斜杠都可能让模型请求异常,进而让你误判 OpenClaw 整体故障。
第六,安全边界问题。tools.exec.ask 设为 off 后,命令执行会更直接;如果 allowFrom.telegram 再写成*,风险会叠加。更稳妥的做法是只放行必要 Telegram ID,并只在受控私聊或专用运维 bot 里使用这种组合。
排查顺序建议固定下来:先看是否还报 allowFrom,再看是否变成 approval-timeout,然后检查 tools.exec.ask 与 tools.exec.security,最后用 elevated 执行 id 确认是否真的进入 root 上下文。不要一上来就在 Linux 终端里盲找审批入口。
六、语义一致 CTA:OpenClaw 模型通道接 TaoToken,提权链路再回 Telegram 验证
如果你现在正卡在 OpenClaw 的模型认证或 Key 配置上,建议先把模型通道和提权门控分开处理。模型通道只需要 TaoToken 的 Base URL 和 Key:Base URL 用 https://taotoken.net/api,不要带 /v1,也不要给 API 地址加 UTM;Key 用你在 TaoToken 控制台创建的 YOUR_API_KEY。创建 Key 和查看接入步骤可以走这两个入口:
- TaoToken API Keys:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=openclaw_priv_escalation_api_keys
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=openclaw_priv_escalation_doc
拿到 Key 后按 OpenClaw 教程填入模型认证,再回到 Telegram 验证普通对话是否能通。普通对话能通只说明模型通道 OK;系统命令能否执行,仍回到 ~/.openclaw/openclaw.json 检查 allowFrom 与 exec ask,并用 elevated 执行 id 看是否返回 uid=0(root)。把模型通道和提权链路分开验证,OpenClaw 本地提权报 approval-timeout 的排查会清楚很多。