☰
云端 OpenClaw 远程执行本地进程原理机制详解:Gateway、approvals 与 system.run 到底谁在判定、谁在执行?
2026/10/7 7:52:22 网站建设 项目流程

1. 云端 OpenClaw 远程执行本地进程,为什么“连上了”却跑不起来

很多人第一次搭 OpenClaw 的“云端 Gateway + 本地 Windows 节点”时,都会卡在同一个地方:节点明明在线,node.list也能看到,但一执行nodes run就报approval required或者干脆没反应。这时候最容易产生的误解,就是以为“连上了 = 能执行了”。

OpenClaw 的远程执行链路,本质上是一个控制面与执行面分离的架构。云端 Gateway 负责调度和下发意图,本地 node 负责暴露本机能力,而真正决定“这条命令能不能在这台机器上跑”的,是本地主机上的 approvals 规则。最后把进程真正拉起来的,是system.run。

这三个角色经常被混在一起:有人以为 Gateway 配了tools.exec.host=node就等于本地一定能执行;有人以为system.run既是执行器又是审批器;还有人以为白名单在云端配一次就全局通用。实际上,Gateway 管的是“原则上往哪发”,approvals 管的是“这台机器愿不愿意接”,system.run管的是“接了就真的跑起来”。任意一层没过,命令都不会落地。

这篇文章就围绕一个核心问题展开:一条远程执行请求,从云端发起,到本地进程真正启动,中间到底经过了哪些判定层?每一层分别由谁负责?出问题时应该去哪一层排查?我会给出可复制的 Gateway 与 node 配置片段,并演示一次从审批到落地的完整验证动作,帮你把“谁在判定、谁在执行”这件事彻底理清。

2. TaoToken 前置准备:Gateway 与 node 的接入配置

在拆解执行链路之前,先把接入层的东西准备好。OpenClaw 的 Gateway 需要调用模型能力来驱动 agent 行为,这里我用 TaoToken 作为模型接入层。它的作用是提供统一的 API 入口,让 Gateway 侧的 agent 能正常发起推理请求,进而形成执行意图。

TaoToken 的 API 地址是https://taotoken.net/api,官网是https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。你需要先在控制台创建一个 API Key,然后把它写进 Gateway 的模型配置里。

2.1 Gateway 侧模型配置片段

OpenClaw 的 Gateway 配置文件通常放在~/.openclaw/gateway.json或项目根目录的openclaw.config.json。下面是一个可复制的最小配置,重点是models段和tools.exec段:

{ "models": { "default": { "provider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoToken密钥", "modelId": "claude-sonnet-4-20250514" } }, "tools": { "exec": { "host": "node", "security": "allowlist", "ask": "on-miss", "node": "win-node-01" } } }

这里几个字段的含义要分清楚:host: node表示默认把执行请求发到 node,而不是 sandbox 或 gateway 本机;security: allowlist表示控制面默认按白名单模式处理;ask: on-miss表示未命中规则时才弹审批;node: win-node-01指定默认目标节点。这四个字段合起来,定义的是 Gateway 的“默认执行意图”,不是最终裁决。

2.2 node 侧接入配置片段

本地 Windows 节点需要连接到 Gateway 的 WebSocket。假设云端 Gateway 监听在127.0.0.1:18789,本地通过隧道把18790映射过去,那么 node 的配置大致如下:

{ "gateway": { "url": "ws://127.0.0.1:18790", "token": "你的节点配对令牌" }, "node": { "name": "win-node-01", "caps": ["system", "browser"], "commands": ["system.run", "system.run.prepare", "system.which"] } }

注意commands里必须显式声明system.run,否则即使节点在线,Gateway 也不会把执行请求分发过来。这是很多人忽略的一层:节点在线不等于节点具备目标能力。

2.3 本地 approvals 文件位置

真正的主机侧闸门在C:\Users\你的用户名\.openclaw\exec-approvals.json。这个文件是每台执行主机各自持有的,不是云端全局规则。它的典型结构如下:

{ "security": "allowlist", "ask": "on-miss", "askFallback": "deny", "allowlist": [ { "command": "paper_scan.cmd", "args": [] }, { "command": "paper_rename.cmd", "args": ["--dry-run"] } ] }

allowlist里只放你定义好的固定脚本入口,不要直接放开 PowerShell 或 cmd 的任意执行能力。这样system.run就从“通用执行器”变成了“受控流程触发器”,安全边界清晰得多。

3. 可复制配置:Gateway、node 与 approvals 三件套对齐

配置能不能跑通,关键不在于某一段写得多漂亮,而在于三件套是否对齐:Gateway 的 Base URL + Key + Model ID、node 的 Gateway URL + Token + 能力声明、本地 approvals 的 allowlist 入口。任何一处对不上,链路就会在对应层断掉。

3.1 Gateway 三件套:Base URL、Key、Model ID

Gateway 侧调用模型时,必须保证三个字段完整且一致:

字段值说明
baseUrlhttps://taotoken.net/api模型 API 入口,不要带多余路径
apiKeysk-...在 TaoToken 控制台创建
modelIdclaude-sonnet-4-20250514与 Key 权限匹配的模型

如果你用的是 Claude Code 类的接入方式,配置会写在~/.claude/settings.json里,结构类似:

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoToken密钥", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }

这三个字段缺一不可。只填 Base URL 不填 Key,会直接 401;Key 和 Model ID 不匹配,会在推理阶段报模型不存在。

3.2 node 三件套:Gateway URL、Token、能力声明

node 侧要连上 Gateway,同样需要三件套对齐:

{ "gateway": { "url": "ws://127.0.0.1:18790", "token": "配对时生成的节点令牌" }, "node": { "name": "win-node-01", "caps": ["system"], "commands": ["system.run", "system.which"] } }

url必须指向隧道映射后的本地端口,token必须和 Gateway 侧配对记录一致,commands必须包含system.run。这三者任意一个不对,node.list可能还能看到节点,但nodes run一定失败。

3.3 approvals 三件套:security、ask、allowlist

本地 approvals 文件里,最关键的三个字段是:

{ "security": "allowlist", "ask": "on-miss", "askFallback": "deny", "allowlist": [ { "command": "paper_scan.cmd", "args": [] } ] }

security决定整体模式,ask决定未命中时是否弹审批,askFallback决定没有审批 UI 时怎么办。allowlist里只放固定脚本入口。如果命令没命中 allowlist,又没有可用的审批 UI,就会停在approval required (approval UI not available),根本走不到system.run。

3.4 三件套对齐检查表

层必填项常见错误
GatewaybaseUrl + apiKey + modelIdKey 缺失导致 401
nodeurl + token + commands未声明 system.run
approvalssecurity + ask + allowlist命令未命中白名单

把这三张表逐项核对一遍,大部分“连上了却跑不起来”的问题都能定位到具体层。

4. 验证请求:一次远程执行从审批到落地的完整动作

配置对齐之后,接下来做一次完整的验证。目标很明确:观察一条命令从 Gateway 下发,到本地 approvals 判定,再到system.run真正启动进程的全过程。

4.1 第一步:确认节点在线且能力声明正确

先在 Gateway 侧执行:

openclaw gateway call node.list

返回结果里应该能看到win-node-01,状态是paired和connected,并且commands里包含system.run。如果这里看不到节点,说明网络层或 WebSocket 层没通,先别往下走。

4.2 第二步:发起一次命中白名单的执行请求

假设本地已经放好了paper_scan.cmd,并且它已经在 approvals 的 allowlist 里。执行:

openclaw nodes run --node win-node-01 --command paper_scan.cmd

如果一切正常,你会看到命令在本地 Windows 上真正跑起来,并返回执行结果。这个过程里,Gateway 只负责把请求转发给 node,node 读取本地exec-approvals.json判定命中 allowlist,然后才调用system.run启动进程。

4.3 第三步:发起一次未命中白名单的请求

把命令换成一个不在 allowlist 里的入口,比如:

openclaw nodes run --node win-node-01 --command whoami.exe

这时候你会看到approval required或者直接被拒绝。关键点是:这条命令根本没有到达system.run,它在 approvals 这一层就被拦住了。这正好验证了“审批通过之后才真正执行”的顺序。

4.4 第四步:观察执行结果与返回链路

命中白名单时,system.run启动的进程继承的是 node host 运行账户的权限。如果 node host 是以普通用户启动的,那么paper_scan.cmd也只能访问该用户能访问的目录。执行结果会通过 node 回传给 Gateway,最终显示在 CLI 或 UI 上。

4.5 验证动作的时序总结

把上面四步按时间顺序串起来:Gateway 根据tools.exec.*形成默认策略,把请求转发给目标 node;node 在本机读取 approvals 再判一次;只有两边都放行,才调用system.run启动本地进程;结果再沿原路返回。这条链路里,任何一层没过,命令都不会真正落地。

5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth

实际排障时,报错信息往往比配置本身更能说明问题。下面几个是高频错误,逐个对照定位。

5.1 401 Unauthorized

这个错误几乎都出在模型接入层。常见原因有三个:TaoToken 的 API Key 没填、填错,或者 Key 与 Model ID 不匹配。检查baseUrl是否为https://taotoken.net/api,apiKey是否以sk-开头,modelId是否在 Key 的权限范围内。三件套对齐后,401 基本消失。

5.2 local proxy failed

这个报错通常出现在 node 连接 Gateway 的阶段。可能是隧道没通、端口映射不对,或者 node 配置里的gateway.url指向了错误端口。先确认ws://127.0.0.1:18790能连通,再确认 Gateway 侧确实在监听对应端口。网络层不通,后面所有层都无从谈起。

5.3 reading choices 相关报错

这类错误一般出现在模型返回结构解析阶段。可能是模型返回的格式与 Gateway 预期不一致,或者modelId指向了一个不兼容的模型。检查 Gateway 的模型配置,确认provider和modelId匹配。如果用的是 OpenAI 兼容接口,确保返回体里有标准的choices字段。

5.4 OAuth 相关报错

如果你用的是 Claude Code 类接入,可能会遇到 OAuth 令牌过期或未授权的问题。检查~/.claude/settings.json里的ANTHROPIC_API_KEY是否有效,必要时重新在 TaoToken 控制台生成 Key。OAuth 问题通常表现为鉴权失败,和 401 类似但来源不同。

5.5 approval required (approval UI not available)

这个不是模型层错误,而是 approvals 层拦截。含义是命令没命中 allowlist,且当前环境没有可用的审批 UI。解决办法有两个:把命令入口加进 allowlist,或者在有 UI 的环境里手动审批。注意,这个报错说明命令根本没到system.run。

5.6 排障分层对照表

报错所在层排查方向
401模型接入层Key、Base URL、Model ID
local proxy failed网络/连接层隧道、端口、Gateway URL
reading choices协议解析层模型返回格式、provider
OAuth鉴权层令牌有效性、重新生成 Key
approval required主机审批层allowlist、审批 UI

按这张表逐层往下排,比盯着system.run本身有效得多。

6. 语义一致 CTA:把执行链路用起来

理清 Gateway、approvals 与system.run的职责边界之后,下一步就是把这套链路真正用起来。如果你还在配置模型接入,可以先到 TaoToken 控制台创建 API Key,把 Gateway 的模型三件套对齐;如果你已经能跑通单次执行,想进一步做长期编码或 Agent 自动化,可以了解 Coding Plan,把执行能力沉淀成稳定的工作流。

  • 创建 API Key 并管理接入:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
  • 查看接入文档,对照 Gateway 与 node 配置:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
  • 验证模型对话是否正常:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite
  • 长期编码与 Agent 场景:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite

最后留一个我踩过的坑:不要一上来就放开 PowerShell 的任意执行能力。把system.run收敛到几个固定脚本入口,比如paper_scan.cmd、paper_rename.cmd,既方便 allowlist 管控,也方便审计和回放。真正安全的思路从来不是给system.run更多权力,而是让它只走你定义好的、边界清晰的受控入口。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询