MacOS下Cron执行Osascript无法发送按键如何解决
报错根因
macOS 10.14及以上版本的TCC安全框架会对所有模拟按键、跨应用控制的操作做强制权限校验。你手动在终端执行osascript时,已经给终端App授予过「辅助功能」权限,因此脚本可以正常运行;但cron是系统后台调度服务,其启动的进程运行在独立的非GUI会话上下文,既没有拿到对应的控制权限,也无法默认关联当前登录用户的前台窗口,因此触发osascript is not allowed to send keystrokes (1002)报错。
解决步骤
1. 为cron二进制授予辅助功能权限
cron的可执行文件默认存放在系统路径下,需要手动将其加入权限白名单:
- 打开访达,按下
Command+Shift+G,输入路径/usr/sbin/后回车进入目录 - 找到名为
cron的二进制文件,将其拖拽到桌面临时存放 - 打开「系统设置」→「隐私与安全性」→「辅助功能」
- 点击权限列表左下角的锁形图标,输入系统密码解锁编辑权限
- 将桌面上的
cron文件直接拖拽到辅助功能权限列表中,确认条目前方的开关处于开启状态
2. 确认自动化权限配置
- 进入「系统设置」→「隐私与安全性」→「自动化」
- 在权限列表中找到
osascript条目,确认其下的「System Events」权限开关为开启状态 - 如果找不到对应条目,先在终端手动执行一次你的脚本,触发权限申请弹窗后点击允许,再回到设置页面确认配置
3. 调整crontab任务的运行上下文
cron默认启动的进程没有绑定当前登录用户的GUI会话,可能出现权限正常但按键无法发送到前台应用的问题,将原有crontab规则替换为以下内容即可:
25 * * * * launchctl asuser $(id -u) /usr/bin/osascript /Users/eric/scripts/script.scpt
命令中$(id -u)会自动读取当前登录用户的UID,保证脚本运行在和你手动操作一致的GUI会话上下文。
注意事项
- 每次macOS大版本更新后,TCC权限数据库可能被系统重置,需要重新为cron配置辅助功能权限
- 不要使用
sudo crontab -e编辑root用户的定时任务,root上下文的进程权限隔离逻辑更复杂,直接用日常登录的普通用户身份配置crontab即可 - 如果配置完成后仍然报权限错误,可以在终端执行
tccutil reset Accessibility重置所有辅助功能权限,再按照上述步骤重新授权
内容的提问来源于stack exchange,提问作者Eric Xue
相关产品推荐
相关产品推荐

