1. 云端 OpenClaw 远程执行本地进程为什么“连上了”却跑不起来很多人第一次搭 OpenClaw 的“云端 Gateway 本地 Windows 节点”时都会卡在同一个地方节点明明在线node.list也能看到但一执行nodes run就报approval required或者干脆没反应。这时候最容易产生的误解就是以为“连上了 能执行了”。OpenClaw 的远程执行链路本质上是一个控制面与执行面分离的架构。云端 Gateway 负责调度和下发意图本地 node 负责暴露本机能力而真正决定“这条命令能不能在这台机器上跑”的是本地主机上的 approvals 规则。最后把进程真正拉起来的是system.run。这三个角色经常被混在一起有人以为 Gateway 配了tools.exec.hostnode就等于本地一定能执行有人以为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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_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 IDGateway 侧调用模型时必须保证三个字段完整且一致字段值说明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会直接 401Key 和 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 缺失导致 401nodeurl token commands未声明 system.runapprovalssecurity 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 只负责把请求转发给 nodenode 读取本地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.*形成默认策略把请求转发给目标 nodenode 在本机读取 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/apiapiKey是否以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 IDlocal proxy failed网络/连接层隧道、端口、Gateway URLreading choices协议解析层模型返回格式、providerOAuth鉴权层令牌有效性、重新生成 Keyapproval 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_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite查看接入文档对照 Gateway 与 node 配置https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite验证模型对话是否正常https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite长期编码与 Agent 场景https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite最后留一个我踩过的坑不要一上来就放开 PowerShell 的任意执行能力。把system.run收敛到几个固定脚本入口比如paper_scan.cmd、paper_rename.cmd既方便 allowlist 管控也方便审计和回放。真正安全的思路从来不是给system.run更多权力而是让它只走你定义好的、边界清晰的受控入口。