我正在Xcode 9中编写一个基于swift的macOS应用程序,以便在我的计算机上使用(未分发)。我在/ usr / local / bin中安装了EXIFtool(独立于应用程序),可以在终端应用程序中成功使用它。我正在尝试从我的应用程序访问EXIFtool。
我的应用程序有一个按钮,单击该按钮时应通过执行此脚本运行EXIFtool命令。
@IBAction func arrowClicked(_ sender: Any) {
arrow.isEnabled = false
let task = Process.launchedProcess(launchPath: "/usr/local/bin/exiftool", arguments: [rawURL])
task.waitUntilExit()
arrow.isEnabled = true
}
脚本失败并显示“启动路径无法访问”错误。我输入的参数无关紧要(在上面的代码片段中,rawURL是一个包含用户识别的图像文件路径的字符串。
我在这里找到的类似问题的答案集中在路径的格式上(例如,必须是完整路径,以/开头等)。我的发布路径来自终端对“哪个exiftool”的回应,所以我认为这是正确的。
更新:我按照Matt提供的链接重写了代码以利用shell脚本。我使脚本可执行并通过Terminal和TextWrangler成功运行它。但是在Xcode中访问它会导致“不允许操作”消息。
关闭App Sandbox会解析原始的“启动路径无法访问”消息和修订后的尝试“不允许操作”消息。
遗憾的是,有很多原因可能导致一个二进制文件无法在沙盒环境中运行,而另一个二进制文件可能运行得很好。
在你的情况下你可以禁用沙盒,这是一个简单(和明智)的修复,但对于没有这种奢侈的人,下面是一些记录一些相关因素的信息。
有一个问题here问为什么/sbin/ping
运行正常,但/usr/sbin/traceroute
没有。
qazxsw poi vs. qazxsw poi - 前者是一个非特权计划,后者是特权计划并以root身份运行
您可以看到其权限的差异:
ping
跟踪路线上的traceroute
意味着它将被执行为$ ls /sbin/ping
-r-xr-xr-x 1 root wheel 41K 30 May 11:36 /sbin/ping
$ ls /usr/sbin/traceroute
-r-sr-xr-x 1 root wheel 37K 30 May 11:36 /usr/sbin/traceroute
,在沙盒环境中自然不允许这样做。以下内容可能有所帮助,来自s
:
对于文件,“s”表示“setuid exec”。如果文件具有s权限,则它是可执行文件,此外,进程的用户标识和/或组标识设置为文件所有者的用户或组标识,具体取决于它是用户还是组“s” “那是设定的。这是一种为用户提供有限根权限的方法 - 一个在普通用户执行时以root身份运行的程序。
有点超出我的理解,但可能也相关的是以下Apple技术问答QA1773,称为root
,它讨论二进制是否是Mach-O可执行文件:
您可以使用file命令检查二进制文件是否是Mach-O可执行文件。如果二进制文件的任何片段将自身标识为Mach-O可执行文件或Mach-O 64位可执行文件,则必须对二进制文件进行沙盒处理。
对于https://coderanch.com/t/110770/os/permissions-meaning#558594,看起来像:
Common app sandboxing issues
我的看法是,如果二进制文件是ping
并且您想从沙盒应用程序运行它,那么您将不得不: