Возможно ли выполнить двоичный файл, расположенный внутри контейнера песочницы приложения macOS?
В качестве теста я попытался использовать Process()
для запуска двоичного файла PHP. Это прекрасно работает при запуске PHP, найденного на usr/bin/php
, но если я скопирую его в контейнер песочницы приложения, он не запустится. Ошибка launch path not accessible
.
Шаги, чтобы продемонстрировать проблему:
Поместите это в голое изолированное приложение ViewController
:
let path = "/usr/bin/php"
let process = Process()
process.launchPath = path
process.arguments = ["-v"]
process.launch()
Результат в консоли:
PHP 7.1.16 (cli) (built: Apr 1 2018 13:14:42) ( NTS )
Измените путь в приведенном выше коде на:
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let path = documentsURL.absoluteString + "php"
print(path)
Правильный путь выводится на консоль:
file:///Users/myuser/Library/Containers/com.domain.SandboxedApp/Data/Documents/php
Скопируйте бинарный файл PHP в контейнер:
$ cp /usr/bin/php /Users/myuser/Library/Containers/com.domain.SandboxedApp/Data/Documents
Получившаяся ошибка в консоли:
2018-07-01 20:08:30.630442+1200 SandboxedApp[43579:20898286] Failed to set (contentViewController) user defined inspected property on (NSWindow): launch path not accessible
Почему Process()
не запускает PHP из контейнера? И почему такое странное сообщение об ошибке?
(nb вы могли бы спросить, почему я хотел бы сделать это. Есть несколько причин, например, я хотел бы глубже понять, как работают разрешения для песочницы; я хотел бы поместить в песочницу приложение, которое может запускать пользователя поставляемые двоичные файлы, не предоставляемые macOS и не распространяемые в комплекте приложения - да, не предназначенные для распространения на MAS, я знаю, что это нарушает их условия).