审批
在手机上批准 Claude Code(和 Codex)的权限请求
智能体停滞不前,最常见的原因是一条没人看到的权限请求。在手机上回应它有三种方式:Claude Code 自带的推送通知、自己搭建的 ntfy hook,或者一个带收件箱的应用。下面介绍每种方式在 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 会在固定的时机运行你配置的程序。
PermissionRequesthook 在权限对话框即将出现时触发,它可以输出一个决定来替你作答,例如{"behavior": "allow"}或"deny"。PreToolUsehook 在每次工具调用前触发,可以返回allow、deny、ask或defer。所有自建的手机审批工具,原理都是一个发送推送、然后等你点按的 hook。详情见 hooks 参考文档。
Claude Code 的原生推送
Anthropic 官方的方案基于 Remote Control:
- 用
claude remote-control(服务器模式)或claude --remote-control启动会话,或者在运行中的会话里输入/remote-control。 - 在手机上用同一个账号登录 Claude 应用,并允许通知。
- 在终端中运行
/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) | PermissionRequest | 120 秒后回退到终端提示(计划审阅为 300 秒) | npm install -g claude-remote-approver;生成 128 位随机主题;批准 / 始终批准 / 拒绝 |
| claude-push(coa00) | PermissionRequest | 90 秒后回退到终端(可配置) | 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,默认开启。
PermissionRequesthook 可以用"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 的文档警告说,超时的
PreToolUsehook 不会阻止工具调用,调用会继续走正常的权限流程,所以别指望一个卡住的 hook 能起到把关作用。 - 保护好通道。审批流量会暴露你的智能体在做什么。Anthropic 的 Remote Control 经过 Anthropic 的服务器,Maude 的中继只能看到端到端加密的流量。用 hook 的话,流量去哪由你决定。Anthropic 的 Require trusted devices 设置可以限制哪些设备能使用 Remote Control。
- 审批是安全网,不是沙箱。以非 root 用户在一台可以随时重建的机器上运行智能体,比任何审批界面都重要。见如何安全地以完全权限运行智能体。
用 Maude 回应它们
如果你的智能体运行在服务器上,而你希望在一个地方统一回应,可以试试 Maude 搭配 Claude Code 或 Codex。在应用里添加服务器,用你自己的套餐登录,权限请求就会以带“允许”和“拒绝”的推送通知送达。收件箱则汇集所有等你处理的事项。
常见问题
Claude Code 能发送推送通知吗?
/config 中开启 Push when actions required(也可以再开启 Push when Claude decides)。需要 Pro、Max、Team 或 Enterprise 套餐,不支持 API 密钥登录。能在锁屏上直接允许或拒绝吗?
如果我不回应会怎样?
PreToolUse hook 不会阻止工具调用。这对 Codex 也适用吗?
PermissionRequest hook,hookline 等项目就用它把 Codex 的审批转发到 ntfy。据第三方报告,Codex 的 notify 设置只覆盖已完成的轮次,所以审批要用 hooks。在手机上批准命令安全吗?
更新内容
- — 首次发布。Remote Control 和 hooks 的行为已对照 Anthropic 和 OpenAI 文档核实;各代码仓库的细节和默认值取自当日各项目的 README。