Comment exécuter une commande launchd en tant que root

32

J'ai la commande launchctl suivante en tant que fichier .plist. Il est chargé et configuré pour s'exécuter une fois par jour, mais il doit s'exécuter en tant que root et je ne sais pas comment le vérifier.

En outre, ce travail cron consiste essentiellement à placer des CD dans un répertoire et à exécuter une commande. Je suis sûr que launchd a une meilleure façon de spécifier le répertoire où il est censé exécuter la commande.

Comment puis-je savoir qu'il est exécuté en tant que root et existe-t-il une meilleure façon d'écrire cela?

<?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>
Emmanuel Mwangi
la source

Réponses:

46

Dans quel dossier le est-il .pliststocké?

launchdexécute Daemons ( /Library/LaunchDaemonsou /System/Library/LaunchDaemons) en tant que root et les exécutera, que les utilisateurs soient connectés ou non. Les agents de lancement ( /Library/LaunchAgents/ou ~/Library/LaunchAgents/) sont exécutés lorsqu'un utilisateur est connecté en tant qu'utilisateur. Vous ne pouvez pas utiliser setuid pour changer l'utilisateur exécutant le script sur les démons.

Parce que vous voudrez l'ajouter, /Library/LaunchDaemonsvous voudrez vous assurer de le charger launchdavec des privilèges d'administrateur (par exemple. sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist)

Consultez man launchdpour plus d'informations.

Chealion
la source
Merci. C'est exactement ce que je cherchais pour répondre au problème racine. Le script se trouve dans / Library / LaunchDaemons, il s'exécutait donc déjà en tant que root.
Emmanuel Mwangi
Une question pour les débutants: l'exécution est-elle launchctlrequise pour l'installation d'un démon? Je veux dire, ne suffit-il pas de copier le fichier plist dans le chemin correspondant?
Claudix
@Claudix: C'est exact. Copier la configuration launchd en place ne suffit pas - vous devez toujours "l'activer" (lancement launchctl)
Chealion
4

Avez-vous essayé d'utiliser l'un des éditeurs launchd?

Pour vous assurer qu'il est exécuté en tant que root, je suis presque sûr que launchd exécutera les programmes en tant que root. Avez-vous déjà pensé à donner la propriété du script pour rooter en utilisant chmod? De cette façon, il ne s'exécutera que s'il est exécuté en tant que root. Vous devez ensuite vérifier qu'il fonctionne.

sudo chown root:admin script_to_run_by_launchd
hanleyp
la source
J'ai utilisé Lingon pour écrire ce script. Et je peux affirmer que cela fonctionne bien dans Leopard.
Emmanuel Mwangi
3

Les listes de propriétés dans LaunchAgents fonctionnent également, mais vous devez charger les agents et les démons avec sudo:

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

Si le plist n'a pas de clé désactivée, il est chargé lors de la prochaine connexion ou redémarrage par défaut, et -wn'est pas nécessaire.

Note technique TN2083: Démons et agents :

Un démon est un programme qui s'exécute en arrière-plan dans le cadre du système global (c'est-à-dire qu'il n'est pas lié à un utilisateur particulier). Un démon ne peut afficher aucune interface graphique; plus précisément, il n'est pas autorisé de se connecter au serveur Windows.

[...]

Un agent est un processus qui s'exécute en arrière-plan au nom d'un utilisateur particulier. Les agents sont utiles car ils peuvent faire des choses que les démons ne peuvent pas, comme accéder de manière fiable au répertoire personnel de l'utilisateur ou se connecter au serveur Windows.

Lri
la source
3

Pour les Googleurs cherchant à exécuter spécifiquement un agent de lancement avec des privilèges root au lieu d'un démon de lancement , cela peut être fait par:

  • Créez votre LaunchAgent dans ~/Library/LaunchAgents
  • Exécutez votre application avec sudovia la ProgramArgumentspropriété dans votre plist
  • Définissez l' NOPASSWDoption pour votre application dans/etc/resolvers.d

Pour plus de détails, consultez ceci et cette réponse.

Cory Klein
la source
2

LaunchControl m'a rendu indolore à Yosemite. Il a une belle interface graphique par glisser-déposer pour vous aider à créer ou à modifier des services. C'était surprenant de voir tous les services fonctionner que je ne connaissais pas.

Pas

  1. Lancer LaunchControl
  2. Changement en haut à gauche pour GlobalDeamons et entrez votre mot de passe administrateur
  3. Fichier-> Nouveau
  4. Sous l'étiquette, donnez-lui un nom unique. La convention est "com.company.appname"
  5. Sous Programme pour exécuter, utilisez le script Unix Shell ou la commande que vous préférez SANS arguments
  6. Si votre application nécessite des arguments, changez le champ déroulant de "Argv par défaut" en "Argv personnalisé"
    1. fournissez maintenant l'argument que vous utiliseriez normalement comme vous l'exécuteriez à partir de la ligne de commande réelle.
  7. Run at Load est facultatif, vous décidez.
  8. Du côté droit, faites glisser et déposez StartInterval et définissez l'intervalle souhaité. La FAQ sous le menu Aide est très bonne.
Jose Leon
la source
Pouvez-vous modifier votre message pour inclure les étapes que le demandeur peut prendre pour résoudre son problème?
Cfinley