如何在启用 Mac App Sandbox 的情况下运行 Shell 脚本?

Posted

技术标签:

【中文标题】如何在启用 Mac App Sandbox 的情况下运行 Shell 脚本?【英文标题】:How to Run a Shell Script with Mac App Sandbox Enabled? 【发布时间】:2013-11-12 19:17:45 【问题描述】:

是否有可能有一个在沙盒中运行的应用程序执行一个 shell 脚本? 该脚本使用两个基本命令:

defaults write
killall

我知道沙盒有一些例外,可以通过权利文件添加,但不确定是否可以让用户确认小脚本的执行然后运行它?

请给我一个实用的提示... 当我在关闭沙盒​​的情况下运行我的应用程序时,一切正常。 两个命令上的沙箱都不起作用,这会显示在控制台中:

killall: warning: kill -TERM 12322: Operation not permitted

【问题讨论】:

【参考方案1】:

当应用程序被沙盒化时,可以从NSApplicationScriptsDirectory 目录运行脚本。

NSURL *scriptsDirectory = [[NSFileManager defaultManager] URLForDirectory:NSApplicationScriptsDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error];

那么用户如何授予想要运行脚本的应用程序的访问权限?

该机制非常简单:您的应用程序只能从用户帐户中的特定文件夹运行脚本。脚本可以进入该文件夹的唯一方法是用户将它们复制到那里。从本质上讲,OS X 为您提供了这些脚本中内容的只读视图。

https://www.objc.io/issues/14-mac/sandbox-scripting/

关于这个主题的一篇很棒的文章^^^

【讨论】:

【参考方案2】:

您为什么首先要将如此强大的应用程序沙盒化?您想修改默认值并为特定的其他应用程序(以某种方式可能)或“所有存在于机器上的应用程序”修改默认值并杀死所有应用程序吗?

如果对于特定的其他应用程序,为什么不不用外壳呢? 对于默认写入使用 com.apple.security.temporary-exception.shared-preference.read-write 并添加您要修改的域(例如 com.apple.DigitalColorMeter)并使用 CFPreferencesSetValue()

对于 killall 使用 com.apple.security.temporary-exception.apple-events 并运行 Applescript / 发送 AppleEvents 以终止特定进程。

【讨论】:

嘿,我想你的回答听起来很不错......让我在接下来的几天里检查一下,我给你信用;)【参考方案3】:

如果你有充分的理由,你可以像这样杀死应用程序:

How can I terminate my app in a helper app with sanboxing enabled?

【讨论】:

以上是关于如何在启用 Mac App Sandbox 的情况下运行 Shell 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

全网首发:(解决办法)MAC OS Xcode给应用设置沙箱(Enable App Sandbox)之后,运行报错Illegal instruction: 4

如何在没有 Mac 的情况下启用应用内购买

Mac App Sandbox - NSHomeDirectory() 问题

Mac App Store Sandbox - 安装用户脚本?

如何在 OSX 上为 Python 应用程序启用 App 沙箱(Python 应用程序针对 Mac App Store)

App Sandbox/iCloud 和 Snow Leopard 向后兼容