Wie starte ich einen Prozess als bestimmter Benutzer beim Start unter OS X?

10

Ich möchte beim Start ein Skript als bestimmter Benutzer ausführen (nicht beim Anmelden). Ich dachte, ein LaunchDaemon würde es tun, aber 'man launchd' sagt:

"Wenn Sie möchten, dass Ihr Dienst als bestimmter Benutzer in der Umgebung dieses Benutzers ausgeführt wird, ist es das EINZIGE unterstützte Mittel, dies unter Mac OS X zu erreichen. Mit anderen Worten, es reicht nicht aus, eine Setuid auszuführen (2) ) unter Mac OS X ein Benutzer im wahrsten Sinne des Wortes zu werden. "

Sie machen keine Witze - wenn ich versuche, mein Skript als LaunchDaemon auszuführen, funktioniert es nicht. Insbesondere versuche ich, einige Schlüsselbundoperationen mit dem Befehl 'security' zu automatisieren, und ich kann den Standardschlüsselbund nicht ändern, wenn ich das Skript über LaunchDaemon ausführe, obwohl das Skript gut funktioniert, wenn es mit sudo aus einer Shell ausgeführt wird.

Ein LaunchAgent funktioniert nicht, da das Ziel darin besteht, dass die Prozesse ausgeführt werden, ohne dass sich ein Benutzer anmeldet, und LaunchAgents nur ausgeführt wird, wenn sich jemand anmeldet. Ich habe mir cron und die @ reboot-Direktive angesehen und das sieht vielversprechend aus, aber ich habe gelesen, dass cron ist veraltet unter OSX.

Scott Bonds
quelle

Antworten:

12

Ich hatte ähnliche Probleme beim Versuch, einen lang laufenden Prozess mit einem Standardschlüsselbund durchzuführen. Im Wesentlichen scheint LaunchAgent nicht in einer vollständigen Anmeldeumgebung zum Ausführen der Sicherheitsbefehle ausgeführt zu werden, sodass das Ändern des Standardschlüsselbunds nicht funktioniert und ein Berechtigungsfehler für das /Library/Preferences/Verzeichnis auftritt .

Die geheime Sauce ist hinzuzufügen:

<key>SessionCreate</key>
<true/>

zu Ihrer Plist. Dies ist eine undokumentierte Funktion, die eine ordnungsgemäße Umgebung erzwingt und es Ihnen ermöglicht, den Standardschlüsselbund festzulegen. Kredit Jönsson auf diese Frage für den Hinweis mich in die richtige Richtung.

Mark Cheverton
quelle
Wenn ich meine org.apache.httpd.plist so bearbeite, dass sie dies enthält, wird dies erst wirksam, wenn das System korrekt neu gestartet wird. Ich kann Apache nicht einfach neu starten, um dies zu tun?
atreat
2

Speichern Sie als globaler Daemon ( /Library/LaunchDaemons) und geben Sie den Benutzer mit dem Schlüssel an UserName:

<key>UserName</key>
<string>Put username here</string>
Bruno
quelle
1
Dies sollte ab heute die richtige Antwort sein. Vielen Dank
Voke Ransom Anighoro
1

Es gibt eine Reihe anderer Stellen, an denen Sie Startelemente in OS X ausblenden können (von denen die meisten nicht unterstützt werden). Ich würde es versuchen /etc/rc.local; Ich erinnere mich an die Arbeit in Panther, daher besteht die Möglichkeit, dass sie heute noch funktioniert.

Handwerker5
quelle