Wie führe ich einen launchd-Befehl als root aus?


32

Ich habe den folgenden Befehl launchctl als .plist-Datei. Es wird geladen und ist so eingestellt, dass es einmal am Tag ausgeführt wird. Es muss jedoch als Root ausgeführt werden, und ich bin nicht sicher, wie ich das überprüfen soll.

Dieser Cron-Job wird grundsätzlich in ein Verzeichnis kopiert und führt einen Befehl aus. Ich bin sicher, dass launchd das Verzeichnis, in dem der Befehl ausgeführt werden soll, besser spezifizieren kann.

Woher weiß ich, dass es als root ausgeführt wird und gibt es eine bessere Möglichkeit, dies zu schreiben?

<?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>dev.project.frontpage.feedparser</string>
    <key>ProgramArguments</key>
    <array>
        <string>cd</string>
        <string>/Users/eman/src/project/trunk/includes/;</string>
        <string>./feed-parser.php</string>
        <string>-c</string>
        <string>./feed-parser-config.xml</string>
    </array>
    <key>QueueDirectories</key>
    <array/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>12</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>WatchPaths</key>
    <array/>
</dict>
</plist>

Antworten:


46

In welchem ​​Ordner ist das .plistgespeichert?

launchdführt Daemons ( /Library/LaunchDaemonsoder /System/Library/LaunchDaemons) als root aus und führt sie unabhängig davon aus, ob Benutzer angemeldet sind oder nicht. Launch Agents ( /Library/LaunchAgents/oder ~/Library/LaunchAgents/) werden ausgeführt, wenn ein Benutzer als dieser Benutzer angemeldet ist. Sie können setuid nicht verwenden, um den Benutzer zu ändern, der das Skript in Daemons ausführt.

Da Sie es hinzufügen /Library/LaunchDaemonsmöchten, möchten Sie sicherstellen, dass Sie es launchdmit Administratorrechten (z. B. sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist) laden .

Schauen Sie sich man launchdfür weitere Informationen.


Vielen Dank. Dies ist genau das, wonach ich gesucht habe, um das Grundproblem zu lösen. Das Skript befindet sich in / Library / LaunchDaemons und wurde bereits als root ausgeführt.
Emmanuel Mwangi

Eine Frage launchctlfür Neulinge: Wird Laufen für die Installation eines Daemons benötigt? Ich meine, reicht es nicht aus, die plist-Datei in den entsprechenden Pfad zu kopieren?
Claudix

@Claudix: Das stimmt. Das Kopieren der launchd-Konfiguration an Ort und Stelle reicht nicht aus - Sie müssen sie immer noch "einschalten" (launchctl load)
Chealion

4

Haben Sie versucht, einen der launchd-Editoren zu verwenden?

Um sicherzustellen, dass es als root ausgeführt wird, bin ich mir ziemlich sicher, dass launchd die Programme als root ausführen wird. Haben Sie jemals darüber nachgedacht, den Besitz des Skripts mit chmod an root zu übertragen? Auf diese Weise wird es nur ausgeführt, wenn es als root ausgeführt wird. Sie müssen dann überprüfen, ob es ausgeführt wird.

sudo chown root:admin script_to_run_by_launchd

Ich habe Lingon verwendet, um dieses Skript zu schreiben. Und ich kann bestätigen, dass es in Leopard gut funktioniert.
Emmanuel Mwangi

3

Eigenschaftslisten in LaunchAgents funktionieren auch, aber Sie müssen sowohl Agenten als auch Daemons mit sudo laden:

sudo chown root /Library/LaunchAgents/test.plist
sudo launchctl load /Library/LaunchAgents/test.plist

Wenn die plist keinen deaktivierten Schlüssel hat, wird dieser standardmäßig beim nächsten Anmelden oder Neustart geladen und -wist nicht erforderlich.

Technischer Hinweis TN2083: Daemons und Agenten :

Ein Daemon ist ein Programm, das im Hintergrund als Teil des Gesamtsystems ausgeführt wird (dh es ist nicht an einen bestimmten Benutzer gebunden). Ein Daemon kann keine GUI anzeigen. Insbesondere ist es nicht zulässig, eine Verbindung zum Windows-Server herzustellen.

[...]

Ein Agent ist ein Prozess, der im Hintergrund für einen bestimmten Benutzer ausgeführt wird. Agenten sind nützlich, weil sie Dinge tun können, die Daemons nicht können, z. B. zuverlässig auf das Home-Verzeichnis des Benutzers zugreifen oder eine Verbindung zum Windows-Server herstellen.


3

Für Googler eine Einführung speziell laufen suchen Agenten mit Root - Rechten intead eines Auflegungs Daemon kann erfolgen durch:

  • Erstellen Sie Ihren LaunchAgent in ~/Library/LaunchAgents
  • Führen Sie Ihre Anwendung sudoüber die ProgramArgumentsEigenschaft in Ihrer Liste aus
  • Stellen Sie die NOPASSWDOption für Ihre Anwendung in ein/etc/resolvers.d

Weitere Informationen finden Sie in dieser und dieser Antwort.


2

LaunchControl hat es mir in Yosemite leicht gemacht. Es verfügt über eine schöne Drag-and-Drop-Benutzeroberfläche, mit der Sie Dienste erstellen oder bearbeiten können. Es war überraschend zu sehen, dass alle Dienste ausgeführt wurden, von denen ich nichts wusste.

Schritte

  1. Starten Sie LaunchControl
  2. Wechseln Sie oben links zu GlobalDeamons und geben Sie Ihr Administratorkennwort ein
  3. Datei-> Neu
  4. Geben Sie unter label einen eindeutigen Namen ein. Konvention ist "com.company.appname"
  5. Verwenden Sie unter Auszuführendes Programm das Unix-Shell-Skript oder einen beliebigen Befehl, den Sie OHNE Argumente bevorzugen
  6. Wenn für Ihre App Argumente erforderlich sind, ändern Sie das Dropdown-Feld von "Standardargument" in "Benutzerdefiniertes Argument".
    1. Geben Sie jetzt das Argument ein, das Sie normalerweise von der eigentlichen Befehlszeile ausführen würden.
  7. Run at Load ist optional, Sie entscheiden.
  8. Ziehen Sie auf der rechten Seite StartInterval und legen Sie das gewünschte Intervall fest. Die FAQ unter Hilfe-Menü ist sehr gut.

Können Sie bitte Ihren Beitrag so bearbeiten, dass er die Schritte enthält, die der Fragesteller unternehmen kann, um sein Problem zu lösen?
Cfinley
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.