文章梳理 macOS TCC 弹窗导致夜间 Agent 任务停滞的问题,并强调应识别实际获得授权的宿主应用。按自动点击、应用控制、截图及目录访问等任务,对应列出权限设置入口。
如果你在 Mac 上让 AI Agent 无人值守运行(比如在 iTerm 中运行 Claude Code、用 launchd 任务驱动 osascript,或用 Hammerspoon 点击按钮),你很可能遇到过这种情况:早上醒来,发现整晚什么都没发生。原因通常只是一个弹窗停在无人查看的屏幕上:“Terminal” would like to control “System Events”。
这就是 macOS TCC(Transparency, Consent and Control,透明度、同意与控制)。下面介绍如何一次配置好,让它不再白白耗掉你的夜晚。
TCC 授权给的是启动进程的 App,而不是你的脚本。如果 claude 在 iTerm 中运行,需要获得授权的就是 iTerm。如果 launchd 任务运行的是 /bin/bash script.sh,那么权限就会授予 macOS 在弹窗中点名的那个二进制程序。
所以,第一条原则是:选定一个终端 App 作为 Agent 的宿主,把所有权限都授予它。如果把 Agent 分散到 Terminal、iTerm、Warp 和 VS Code 中运行,就意味着要维护四套授权,而且它们很容易变得不一致。
Automation 授权弹窗只会在 App 第一次尝试控制某个目标时出现。配置时就有意识地逐一运行下面的命令,别等到凌晨 3 点才触发:
osascript -e 'tell application "System Events" to get name of first process'
osascript -e 'tell application "Finder" to get name of startup disk'
在每个弹窗中点击 Allow,这一组宿主与目标的授权就完成了。
不要修改 TCC 数据库,也不要禁用 SIP。只需检查功能是否仍然正常:
osascript -e 'tell application "System Events" to get name of first process' >/dev/null 2>&1 \
&& echo "automation OK" || echo "automation BROKEN"
screencapture -x /tmp/tcc-check.png && echo "screen OK"
只要其中任何一项失败,就立即修复,别等到早上才发现。
系统或 App 更新,以及 App 重新签名,都可能悄悄让授权失效:开关看起来仍然开着,但授权已经不再生效。最常奏效的修复方法是:点击减号按钮,将 App 从列表中移除,再重新添加,然后重新启动它。
免费的首次配置清单放在 GitHub 上,名为 agent-ops-samples。完整版 macOS TCC Agent Fleet Runbook(12 美元)还提供完整的权限对应表、从故障症状到修复方法的恢复步骤,以及用于跟踪多台机器授权情况的管理日志。
如果还想采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。