允许AppleScript脚本无需询问权限即可运行

6

你好,我正在使用bash脚本中的osascript告诉进程“Terminal”。

显然,这需要权限。它要求我提供sudo密码,但我想签署并允许此脚本在不进行交互的情况下运行。您能做到吗?

完整的osascript调用如下:

osascript <<END
tell application "Terminal"
    activate
    tell application "System Events"
        tell process "Terminal"
            click menu item "Merge All Windows" of menu "Window" of menu bar 1
        end tell
    end tell
end tell
END

注意:这是在一个shell脚本中。


你是怎么使用它的?它报什么错误? - Mark Setchell
我只需要像使用sudo“something”一样登录。 - Chris G.
为什么需要执行任何sudo?我可以轻松地完成这个操作,而不需要任何问题或登录... osascript -e 'tell application "Terminal" to do script "date"' - Mark Setchell
嗯,有趣。我已经更新了问题,并附上了完整的osascript调用。 - Chris G.
提前给一个小提示: Bash 和 sudo 都与问题无关。你的代码产生的错误信息是 System Events got an error: osascript is not allowed assistive access. (-1719),这表明程序控制 UI 的机制缺少必要的授权。 - mklement0
1个回答

8

更新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仍然会提示输入管理员密码:

  • OS X 10.11 (El Capitan):

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标记。

1
谢谢澄清,@DominikBucher - 我在答案开头添加了一个注释。 - mklement0
1
谢谢,@Dominik。我很感激你的好评。 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接