Swift 4 запущен Путь запуска процесса недоступен

Я пишу быстрое приложение macOS на основе Xcode 9 для использования на моем компьютере (не распространяется). У меня установлен EXIFtool (независимо от приложения) в /usr/local/bin, и я могу успешно использовать его из приложения Terminal. Я пытаюсь получить доступ к 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», поэтому я подумал, что это правильно.


ОБНОВЛЕНИЕ: я перешел по ссылке, предоставленной Мэттом, и переписал код, чтобы использовать сценарий оболочки. Я сделал скрипт исполняемым и успешно запустил его через Terminal и TextWrangler. Но доступ к нему в Xcode привел к сообщению «операция не разрешена».


person Brad    schedule 03.11.2017    source источник


Ответы (2)


Отключение песочницы приложения устраняет как исходное сообщение «путь запуска недоступен», так и исправленное сообщение о попытке «операция не разрешена».

person Brad    schedule 03.11.2017

К сожалению, существует множество причин, по которым один двоичный файл может не работать в изолированной среде, в то время как другой двоичный файл может работать нормально.

В вашем случае вы смогли отключить песочницу, так что это было простым (и разумным) решением, но для тех, у кого нет такой роскоши, ниже приведена некоторая информация, документирующая некоторые важные факторы.

здесь есть вопрос, почему /sbin/ping работает нормально, а /usr/sbin/traceroute нет.

Из один из ответов:

ping против traceroute - первая является непривилегированной программой, последняя является привилегированной и запускается от имени пользователя root

Вы можете увидеть разницу в их разрешениях:

$ 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 в маршруте трассировки означает, что он будет выполняться как root, что, естественно, не разрешено в изолированной среде. Может быть полезно следующее: https://coderanch.com/t/110770/os/permissions-meaning#558594:

«s» для файлов означает «setuid exec». Если файл имеет разрешение s, то он является исполняемым, и, кроме того, идентификатор пользователя и/или идентификатор группы процесса устанавливается равным идентификатору пользователя или группы владельца файла, в зависимости от того, является ли он пользователем или группой. "это установлено. Это способ предоставить пользователю ограниченные права суперпользователя — программа, которая запускается от имени суперпользователя, когда ее запускает обычный пользователь.

Несколько выше моего понимания, но потенциально также актуален следующий технический вопрос и ответ Apple QA1773 под названием Распространенные проблемы с изолированной программной средой, в которой обсуждается, является ли двоичный файл исполняемым файлом Mach-O:

Вы можете проверить, является ли двоичный файл исполняемым файлом Mach-O, используя команду file. Если какой-либо фрагмент двоичного файла идентифицирует себя как исполняемый файл Mach-O или 64-разрядный исполняемый файл Mach-O, этот двоичный файл должен быть изолирован.

Для ping это будет выглядеть так:

$ file /sbin/ping
/sbin/ping: Mach-O 64-bit executable x86_64

Я считаю, что если двоичный файл представляет собой Mach-O executable и вы хотите запустить его из изолированного приложения, вам придется:

  • самостоятельно скомпилировать бинарный файл из исходников, предоставив ему соответствующие права, или
  • импортируйте код в свое приложение и скомпилируйте его непосредственно в свое приложение
person jeff-h    schedule 02.07.2018