Swift 4 launchProcess启动路径无法访问

问题描述 投票:0回答:2

我正在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中访问它会导致“不允许操作”消息。

swift xcode swift4 xcode9
2个回答
1
投票

关闭App Sandbox会解析原始的“启动路径无法访问”消息和修订后的尝试“不允许操作”消息。


0
投票

遗憾的是,有很多原因可能导致一个二进制文件无法在沙盒环境中运行,而另一个二进制文件可能运行得很好。

在你的情况下你可以禁用沙盒,这是一个简单(和明智)的修复,但对于没有这种奢侈的人,下面是一些记录一些相关因素的信息。

有一个问题here问为什么/sbin/ping运行正常,但/usr/sbin/traceroute没有。

one of the answers那里:

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并且您想从沙盒应用程序运行它,那么您将不得不:

  • 自己从源代码编译二进制文件,给它适当的权利,或者
  • 将代码导入您的应用程序并将其直接编译到您的应用程序中
© www.soinside.com 2019 - 2024. All rights reserved.