14.12 远程控制

OpenClaw macOS 应用可以作为远程主机上 OpenClaw 网关的完整远程控制器。这是应用的"通过 SSH 远程运行"功能。

运行模式

  • 本地模式(此 Mac):所有功能都在本机运行,无需 SSH
  • 通过 SSH 远程(默认):OpenClaw 命令在远程主机上执行。Mac 应用通过 -o BatchMode 打开 SSH 连接,使用您选择的身份/密钥和本地端口转发
  • 远程直连(ws/wss):无 SSH 隧道。Mac 应用直接连接到网关 URL(例如通过 Tailscale Serve 或公共 HTTPS 反向代理)

远程传输方式

远程模式支持两种传输方式:

  • SSH 隧道(默认):使用 ssh -N -L ... 将网关端口转发到 localhost。网关会将节点 IP 视为 127.0.0.1
  • 直连(ws/wss):直接连接到网关 URL。网关会看到真实的客户端 IP

远程主机配置要求

  1. 安装 Node + pnpm,构建并安装 OpenClaw CLI(pnpm install && pnpm build && pnpm link --global)
  2. 确保 openclaw 在非交互式 shell 的 PATH 中(如需要可创建符号链接到 /usr/local/bin/opt/homebrew/bin)
  3. 开启 SSH 密钥认证。建议使用 Tailscale IP 以保证局域网外的稳定连接

macOS 应用设置

  1. 打开"设置 → 通用"
  2. 在"OpenClaw 运行于"下选择"通过 SSH 远程",并设置:
    • 传输方式:SSH 隧道 或 直连(ws/wss)
    • SSH 目标:user@host(可选 :port)
    • 如果网关在同一局域网上并广播 Bonjour,可以从发现列表中选择以自动填充此字段
    • 网关 URL(仅直连模式):wss://gateway.example.ts.net(或本地/局域网使用 ws://...)
    • 身份文件(高级):密钥路径
    • 项目根目录(高级):远程代码库路径,用于命令执行
    • CLI 路径(高级):可选的可运行 openclaw 入口点/二进制文件路径(在广播时自动填充)
  3. 点击"测试远程"。成功表示远程 openclaw status --json 正确运行。失败通常意味着 PATH/CLI 问题;退出代码 127 表示远程找不到 CLI
  4. 健康检查和 Web Chat 现在将自动通过此 SSH 隧道运行

Web Chat

  • SSH 隧道:Web Chat 通过转发的 WebSocket 控制端口(默认 18789)连接到网关
  • 直连(ws/wss):Web Chat 直接连接到配置的网关 URL
  • 不再有单独的 WebChat HTTP 服务器

权限要求

远程主机需要与本地相同的 TCC 审批(自动化、辅助功能、屏幕录制、麦克风、语音识别、通知)。在该机器上运行入门向导以一次性授予这些权限。节点通过 node.list / node.describe 广播其权限状态,以便代理知道可用的功能。

安全注意事项

  • 优先在远程主机上使用环回绑定,并通过 SSH 或 Tailscale 连接
  • 如果将网关绑定到非环回接口,需要令牌/密码认证
  • 参见安全Tailscale文档

WhatsApp 登录流程(远程)

在远程主机上运行 openclaw channels login --verbose。使用手机上的 WhatsApp 扫描二维码。如果认证过期,在该主机上重新运行登录。健康检查将显示链接问题。

故障排除

  • "exit 127 / not found":openclaw 不在非登录 shell 的 PATH 中。将其添加到 /etc/paths、shell rc 文件,或创建符号链接到 /usr/local/bin//opt/homebrew/bin
  • "Health probe failed":检查 SSH 连接、PATH,以及 Baileys 是否已登录(openclaw status --json)
  • "Web Chat stuck":确认网关在远程主机上运行,且转发端口与网关 WS 端口匹配;UI 需要健康的 WS 连接
  • "Node IP shows 127.0.0.1":SSH 隧道的预期行为。如果希望网关看到真实客户端 IP,将传输方式切换为直连(ws/wss)
  • "Voice Wake":触发短语在远程模式下自动转发;无需单独的转发器

通知音效

通过 openclawnode.invoke 从脚本为每个通知选择音效:

openclaw nodes notify --node --title "Ping" --body "Remote gateway ready" --sound Glass

应用中不再有全局"默认音效"切换;调用者为每个请求选择音效(或不选)