更新:Dominik Bucher 报告称,下面的解决方案在 macOS High Sierra 及以上版本中不起作用,这似乎是有意为之。
你的AppleScript正在执行的是GUI脚本-以编程方式控制用户界面。
GUI脚本需要执行它的应用程序-在这种情况下是Terminal.app,假设您从那里运行Bash脚本-被授权访问辅助功能在“系统偏好设置>安全性与隐私>隐私>辅助功能”中。
第一次打开尚未获得授权的应用程序(或在其中运行脚本)时,将向您提供前往相关系统首选项窗格的选项。您随后可以手动管理应用程序。只有当前已授权的应用程序才会被勾选。
这是一个一次性的、针对所有用户的应用程序配置步骤,本身需要管理员权限(通过交互提示进行身份验证),但一旦应用程序获得了授权,运行此类脚本就不再需要管理员权限。
(sudo在GUI脚本方面不涉及。)
请参阅苹果的支持文章(写于OS X 10.9时,但仍适用于10.11)。
注意:由于授权是在应用程序级别进行的,因此授权Terminal.app
然后允许从它运行的任何脚本执行GUI脚本。
有一种未经记录的方式可以通过编程授权应用程序,其中管理员身份验证是通过sudo提供的;例如,要授权Terminal.app,请使用以下命令-请注意,除非已经进行身份验证,否则sudo仍然会提示输入管理员密码:
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "REPLACE INTO access values ('kTCCServiceAccessibility', 'com.apple.Terminal', 0, 1, 1, NULL, NULL);"
- OS X 10.10 (Yosemite) 和 10.9 (Mavericks):
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "REPLACE INTO access values ('kTCCServiceAccessibility', 'com.apple.Terminal', 0, 1, 1, NULL);"
有关背景信息,请参见this answer(截至本文撰写时,需要更新以适用于El Capitan)。
据我所知,目前没有办法以一种方式签署单个应用程序/小应用程序,使得它预先授权辅助访问。(此外,已签名的AppleScript小应用程序可能会通过自我修改来使其手动授予权限失效-请参阅上面链接的苹果支持文章。)
授权是在OS X应用程序(*.app包)级别授予的,因此执行GUI脚本的脚本需要授权运行脚本的应用程序,而不是命令行程序(如osascript)在实际解释脚本的应用程序内部(即使错误消息可能会误导地涉及该程序;例如,“osascript未被允许辅助访问”)。请注意保留HTML标记。
sudo
?我可以轻松地完成这个操作,而不需要任何问题或登录...osascript -e 'tell application "Terminal" to do script "date"'
- Mark Setchellsudo
都与问题无关。你的代码产生的错误信息是System Events got an error: osascript is not allowed assistive access. (-1719)
,这表明程序控制 UI 的机制缺少必要的授权。 - mklement0