Я пытаюсь запустить pluginkit
(исполняемый файл, который управляет расширениями на OS X) с запускаемого запуска с правами root.Возможно ли запустить pluginkit из процесса, запущенного как root?
/usr/bin/pluginkit -m -i "<identifier>"
не работает с выходом match: Connection invalid
. Это не так неожиданно, поскольку настройки расширения обрабатываются для каждого пользователя.
Однако, я пытался использовать su
для запуска pluginkit
как обычного пользователя, и он все еще не работает.
su <username> -l -c "/usr/bin/pluginkit -m -i "<identifier>"
также не работает с выходом match: Connection invalid
.
Каким-то образом среда, в которой работает плагин, по-прежнему отличается от обычного пользователя тем, что она не работает должным образом. Есть ли способ запустить pluginkit как root? Или есть ли другой способ запустить процесс как другого пользователя, который может предоставить более полную среду?
Я проверяю это с помощью инструмента командной строки, написанной в Swift:
main.swift
import Foundation
let task = NSTask()
// Option 1: Run pluginkit directly
task.launchPath="/usr/bin/pluginkit"
task.arguments = ["-m", "-i", "com.example.findersyncext"]
// Option 2: Run pluginkit as <username> using 'su'
//task.launchPath="/usr/bin/su"
//task.arguments = ["<username>", "-l", "-c", "/usr/bin/pluginkit -m -i \"com.example.findersyncext\""]
// Option 3: Run pluginkit as <username> using 'sudo'
//task.launchPath="/usr/bin/sudo"
//task.arguments = ["-u", "<username>", "/usr/bin/pluginkit", "-m", "-i", "com.example.findersyncext"]
task.standardOutput = NSPipe()
task.standardError = NSPipe()
task.launch()
task.waitUntilExit()
NSLog("Exit code: \(task.terminationStatus)")
let output = NSString(data: (task.standardOutput!.fileHandleForReading.readDataToEndOfFile()), encoding: NSUTF8StringEncoding)
NSLog("Output: \(output)")
let error = NSString(data: (task.standardError!.fileHandleForReading.readDataToEndOfFile()), encoding: NSUTF8StringEncoding)
NSLog("Error: \(error)")
/Library/LaunchDaemons/com.example.PluginKitTest.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.PluginKitTest</string>
<key>Program</key>
<string>/path/to/PluginKitTest</string>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/Users/<username>/Desktop/pluginkit-error.log</string>
<key>StandardOutPath</key>
<string>/Users/<username>/Desktop/pluginkit-out.log</string>
</dict>
</plist>
Это может помочь показать ваш .plist для демона и его расположение в вашей системе. –
Обновлен с помощью plist и инструмента командной строки, который вызывается. –
См. Http://superuser.com/a/832673/94915; также вам может потребоваться добавить ' UserName ' в plist. –