允许 AppleScript 脚本 运行 无需请求许可

Allow AppleScript script to run without asking for permission

您好,我在 bash 脚本中使用 osascript tell process "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 脚本中。

更新Dominik Bucher 报告说下面的解决方案在 macOS High Sierra 及更高版本,似乎是设计使然。


您的 AppleScript 正在做的是 GUI 脚本 的实例 - 以编程方式控制用户界面。

GUI 脚本要求应用程序执行它 - Terminal.app 在这种情况下,假设您运行正在使用您的Bash 脚本从那里[1] - 在System Preferences > Security & Privacy > Privacy > Accessibility.

中获得辅助访问授权

您第一次打开应用程序(或运行来自其中)尚未授权。您以后始终可以在那里手动管理应用程序。目前只有 checked 个应用程序获得授权。

这是针对所有用户的每个应用程序的一次性配置步骤,本身需要管理权限(身份验证via interactive prompt), 但是一旦应用程序被授权,运行ning 这样的脚本就不再需要管理员权限.
sudo 从未涉及 GUI 脚本。)

参见 Apple's support article 主题(写于 OS X 10.9,但自 10.11 起仍然适用)。

警告:由于授权是在应用程序级别,授权Terminal.app然后允许任何脚本运行从它执行GUI脚本。


有一种未记录的方法以编程方式授权应用程序,其中通过sudo提供管理身份验证;例如,要授权 Terminal.app,请使用以下内容 - 请注意,除非已经通过身份验证,否则 sudo 仍会 提示 输入管理员密码:

  • OS X 10.11 (埃尔卡皮坦):

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 (小牛队):

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 小程序可能会使其 - 手动授予 - 通过自我修改的授权无效 - 请参阅上面链接的 Apple 支持文章。)


[1] OS X 应用程序*.app 捆绑包)级别授予授权,因此执行 GUI 脚本的脚本要求 应用程序 运行 授权脚本 - 而不是命令行程序,例如 osascript inside 实际解释脚本的应用程序(即使错误消息可能 - 误导性地 - 暗示该程序;例如,osascript is not allowed assistive access)。