审批

在手机上批准 Claude Code(和 Codex)的权限请求

智能体停滞不前,最常见的原因是一条没人看到的权限请求。在手机上回应它有三种方式:Claude Code 自带的推送通知、自己搭建的 ntfy hook,或者一个带收件箱的应用。下面介绍每种方式在 Claude Code 中如何运作、换成 Codex 和其他智能体时有什么不同,以及各自在安全上要付出什么代价。

在手机上批准 Claude Code(和 Codex)的权限请求

简要回答

如果你有 Pro、Max、Team 或 Enterprise 套餐,启动 Remote Control,然后在 /config 中开启 Push when actions required。之后 Claude 应用会通知你,你在应用里回应请求即可。如果想要免费、自托管的方案,可以用 claude-remote-approver 等开源 hook,它们会把每个 PermissionRequest 连同批准/拒绝按钮发送到 ntfy。Codex 也有同样的 PermissionRequest hook。Maude 这类应用则把多个智能体的请求汇集到一个收件箱,推送通知上直接带有允许/拒绝按钮。

当 Claude Code 想运行一条命令或编辑一个你没有预先批准的文件时,它会停下来询问。如果你就在终端前,这只需要一秒钟;如果你不在,会话就只能等着——可能为了一次按键干等一个小时。所有远程审批方案做的都是同一件事:把请求送到你的手机上,再把你的答复送回智能体。区别在于:请求如何被拦截、经过哪里,以及谁能回应它。

远程审批的原理

机制只有两种,每个工具都用其中之一。

  • 智能体自带的远程协议。Claude Code 的 Remote Control 会把真实的权限对话框转发到 Claude 应用。Antigravity 的 Remote Control 和 Codex 的 app-server 也是同样的做法。中间没有任何环节替你做决定:你回应的就是智能体自己发出的请求。
  • Hooks。Claude Code 会在固定的时机运行你配置的程序。PermissionRequest hook 在权限对话框即将出现时触发,它可以输出一个决定来替你作答,例如 {"behavior": "allow"} 或 "deny"。PreToolUse hook 在每次工具调用前触发,可以返回 allow、deny、ask 或 defer。所有自建的手机审批工具,原理都是一个发送推送、然后等你点按的 hook。详情见 hooks 参考文档。

Claude Code 的原生推送

Anthropic 官方的方案基于 Remote Control:

  1. 用 claude remote-control(服务器模式)或 claude --remote-control 启动会话,或者在运行中的会话里输入 /remote-control。
  2. 在手机上用同一个账号登录 Claude 应用,并允许通知。
  3. 在终端中运行 /config,开启 Push when actions required,它涵盖权限请求和提问。Push when Claude decides 则涵盖主动更新,比如“测试跑完了”。

文档提到了几件你会遇到的事:

  • 套餐与认证。Remote Control 适用于 Pro、Max、Team 和 Enterprise,不支持 API 密钥。在 Team 和 Enterprise 上,需要由 Owner 开启。
  • 请求不会超时。权限请求和提问会一直保留,直到你回应。
  • 你在终端前时不推送。当你正在已连接的终端中输入或终端处于焦点时,Claude Code 会跳过推送。CLAUDE_CLIENT_PRESENCE_FILE 可以把这个规则扩展到“只要你在这台电脑前”。
  • 进程必须保持运行。claude 进程必须一直运行,所以在服务器上要在 tmux 里启动它。
  • 有些模式无法在应用中选择。根据移动端文档,你不能在应用里选择 Bypass permissions,Remote Control 会话也不能选 Auto。

如果你用的是 Claude 套餐,而且只用 Claude Code,就从这里开始。它包含在你的套餐里,由 Anthropic 维护。

用 ntfy hook 自己搭建

ntfy 是一个开源推送服务。你用一个普通的 HTTP 请求发布到某个主题(topic),手机上的 ntfy 应用就会显示出来。有好几个开源项目把它和 PermissionRequest hook 结合起来:hook 把待处理的工具调用连同操作按钮发布到你的主题,在另一个主题上等你点按,再把决定输出回 Claude Code。这些项目值得一提:

项目Hook如果你不回应备注
claude-remote-approver(yuuichieguchi)PermissionRequest120 秒后回退到终端提示(计划审阅为 300 秒)npm install -g claude-remote-approver;生成 128 位随机主题;批准 / 始终批准 / 拒绝
claude-push(coa00)PermissionRequest90 秒后回退到终端(可配置)Shell 安装脚本;允许 / 拒绝
claude-code-phone-notifications(ssarnecki)PermissionRequest、PreToolUse、Stop等待约 9 分钟,然后回退到终端推送前先等 30 秒,以防你就在电脑前;也会推送 AskUserQuestion 提问(不带按钮)
hookline(tsyche)Claude 用 PreToolUse;Codex 用 PermissionRequest默认 15 分钟,迟到的答复另有更长的窗口还支持 Codex、Grok 和 OpenCode;支持带凭据的自托管 ntfy

这四个项目都采用 MIT 许可证,表中的超时时间是各自文档中的默认值。如果你只需要一个提醒,不需要远程作答,用 Claude Code 的 Notification hook 就够了。对话框出现时,permission_prompt matcher 会触发:

{
  "hooks": {
    "Notification": [
      {
        "matcher": "permission_prompt",
        "hooks": [
          { "type": "command",
            "command": "curl -s -d 'Claude Code is waiting for approval' https://ntfy.sh/your-long-random-topic" }
        ]
      }
    ]
  }
}

把它放进运行 Claude Code 的那台机器上的 ~/.claude/settings.json。不过要作答,你仍然得回到终端前。上面那些项目补上的正是作答这一环。

Maude 的收件箱

Maude 采用的是第一种机制。它在你服务器上的守护进程直接与每个智能体自己的协议通信,所以权限请求是以真实请求的形式到达应用,而不是 hook 的推测。来自每台服务器上每个会话的请求都汇集到同一个收件箱,和错误、已完成的工作放在一起。你可以直接在收件箱里回应,也可以在推送通知上点允许或拒绝。请求会一直等你回应;会话不会超时后自顾自地继续。它适用于 Claude Code、Codex、OpenCode 和 Grok Build。Antigravity 是例外:无头 agy 无法在工具执行前暂停,所以 Maude 会在事后展示被拒绝的操作,如果你允许,就重试一次。Maude 是付费应用,每个智能体还需要各自的账号。它也不是唯一带收件箱和推送的应用:Happier 等应用同样两者兼备。

Codex 和其他智能体

  • Codex 也有 hooks,默认开启。PermissionRequest hook 可以用 "behavior": "allow" 或 "deny" 作答,PreToolUse 可以拒绝。它们配置在 ~/.codex/hooks.json 或 [hooks] 段中(位于 config.toml)。hookline 对 Codex 用的就是这个。Codex 较早的 notify 设置会在一轮结束时运行一个程序。据第三方文章报告,它不会在审批请求时触发,所以审批要用 hooks。关于 Codex 官方的手机应用方案及其在 Linux 上的限制,见 在 VPS 上运行 Codex CLI。
  • Antigravity 在交互式运行或以守护进程运行时,可以在其 Remote Control 控制台上回应请求。无头 agy 则是直接拒绝而不是询问。见在服务器上运行 Antigravity CLI。
  • OpenCode 和 Grok Build 可以通过 hookline 的插件和 hook 支持,或者多智能体应用来覆盖。

远程审批的安全性

在手机上做的审批,其安全程度取决于请求和你的点按之间最薄弱的那一环。

  • 在 ntfy.sh 上,主题名就是密码。ntfy 的文档说得很直白:无需注册,任何知道主题名的人都能读取和发布。在公共服务器上,主题一旦被猜中,别人就能批准你智能体的命令。请使用足够长的随机主题,或者自托管带认证的 ntfy。
  • 看命令本身,而不是标题。锁屏推送只显示摘要。一长串 Bash 命令里的 rm -rf,在 6 英寸的屏幕上很容易漏看。“始终允许”只用于只读工具,别用在 Bash(*) 上。
  • 清楚你的回退行为。上面这些自建 hook 超时后都会回退到终端提示,所以没人回应的请求会被阻塞,而不是自动批准。自己写 hook 也要遵循同样的规则。Claude Code 的文档警告说,超时的 PreToolUse hook 不会阻止工具调用,调用会继续走正常的权限流程,所以别指望一个卡住的 hook 能起到把关作用。
  • 保护好通道。审批流量会暴露你的智能体在做什么。Anthropic 的 Remote Control 经过 Anthropic 的服务器,Maude 的中继只能看到端到端加密的流量。用 hook 的话,流量去哪由你决定。Anthropic 的 Require trusted devices 设置可以限制哪些设备能使用 Remote Control。
  • 审批是安全网,不是沙箱。以非 root 用户在一台可以随时重建的机器上运行智能体,比任何审批界面都重要。见如何安全地以完全权限运行智能体。

用 Maude 回应它们

如果你的智能体运行在服务器上,而你希望在一个地方统一回应,可以试试 Maude 搭配 Claude Code 或 Codex。在应用里添加服务器,用你自己的套餐登录,权限请求就会以带“允许”和“拒绝”的推送通知送达。收件箱则汇集所有等你处理的事项。

常见问题

Claude Code 能发送推送通知吗?
能,通过 Remote Control。把会话连接到 Claude 应用,然后在 /config 中开启 Push when actions required(也可以再开启 Push when Claude decides)。需要 Pro、Max、Team 或 Enterprise 套餐,不支持 API 密钥登录。
能在锁屏上直接允许或拒绝吗?
用基于 ntfy 的 hook 可以:它们会在通知上附加批准/拒绝操作按钮。Anthropic 的文档描述了权限请求的推送,但没有提到通知本身带作答按钮,所以预计需要在 Claude 应用里回应。Maude 的权限推送带有允许和拒绝操作。
如果我不回应会怎样?
在 Claude Code 本身中,权限请求会一直保留到有人回应,所以会话只会等待。自建的 ntfy hook 会在配置的时间窗口后超时,回退到普通的终端提示。自己写的 hook 一定要确认失败时是关闭的:超时的 PreToolUse hook 不会阻止工具调用。
这对 Codex 也适用吗?
适用。Codex 支持可以允许或拒绝的 PermissionRequest hook,hookline 等项目就用它把 Codex 的审批转发到 ntfy。据第三方报告,Codex 的 notify 设置只覆盖已完成的轮次,所以审批要用 hooks。
在手机上批准命令安全吗?
安全程度取决于通道和你的注意力。使用无法猜测或带认证的 ntfy 主题,批准前读完整条命令,避免给 shell 命令设置笼统的“始终允许”规则,并以非 root 用户在一台可以重建的机器上运行智能体。

更新内容

  • — 首次发布。Remote Control 和 hooks 的行为已对照 Anthropic 和 OpenAI 文档核实;各代码仓库的细节和默认值取自当日各项目的 README。

不再错过权限请求

在通知上直接允许或拒绝,覆盖每台服务器上的每个智能体。支持 iOS 和 Android。

Download Maude on the App Store Get Maude on Google Play