web-dev-qa-db-fra.com

Comment exécuter une commande lancée en tant que root

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

En outre, ce travail cron consiste essentiellement à insérer des CD dans un répertoire et à exécuter une commande. Je suis sûr que launchd dispose d'un meilleur moyen de spécifier le répertoire dans lequel il est supposé exécuter la commande.

Comment savoir s'il est exécuté en tant que root et existe-t-il un meilleur moyen 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>
32
Emmanuel Mwangi

Dans quel dossier le .plist est-il stocké?

launchd lance Daemons (/Library/LaunchDaemons ou /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 que cet utilisateur. Vous ne pouvez pas utiliser setuid pour changer l'utilisateur qui exécute le script sur des démons.

Parce que vous voudrez l’ajouter dans /Library/LaunchDaemons, vous voudrez vous assurer de le charger dans launchd avec les privilèges d’administrateur (par exemple, Sudo launchctl load -w /Library/LaunchDaemons/com.Apple.samplelaunchdscript.plist).

Consultez man launchd pour plus d'informations.

46
Chealion

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

Pour être sûr qu'il soit exécuté en tant que root, je suis sûr que launchd exécutera les programmes en tant que root. Avez-vous déjà pensé à donner la propriété du script à root en utilisant chmod? De cette façon, il ne fonctionnera 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
4
hanleyp

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 la pliste n'a pas de clé désactivée, elle est chargée lors de la prochaine connexion ou redémarre par défaut, et -w n'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 spécifiquement, il n'est pas autorisé de se connecter au serveur de fenêtres.

[...]

Un agent est un processus qui s'exécute en arrière-plan pour le compte 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 de base de l'utilisateur ou se connecter au serveur de fenêtres.

3
Lri

Pour les utilisateurs de Google cherchant spécifiquement à exécuter un agent de lancement avec les privilèges root au lieu d'un démon de lancement , vous pouvez le faire par:

  • Créez votre LaunchAgent dans ~/Library/LaunchAgents
  • Exécutez votre application avec Sudo via la propriété ProgramArguments dans votre plist
  • Définissez l'option NOPASSWD pour votre application dans /etc/resolvers.d

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

3
Cory Klein

LaunchControl m'a facilité la tâche à Yosemite. Il a une interface graphique Nice glisser-déposer pour vous aider à créer ou modifier des services. C'était surprenant de voir tous les services en cours d'exécution que je ne connaissais pas.

Pas

  1. Démarrer LaunchControl
  2. En haut à gauche, changez pour GlobalDeamons et entrez votre mot de passe administrateur
  3. Fichier-> Nouveau
  4. Sous étiquette, donnez-lui un nom unique. La convention est "com.company.appname"
  5. Sous Programme à exécuter, utilisez le script Unix Shell ou la commande que vous préférez SANS argument.
  6. Si votre application nécessite des arguments, modifiez le champ déroulant de "Argg par défaut" en "Argv personnalisé" .
    1. maintenant, indiquez l’argument normal, comme vous le feriez depuis la ligne de commande réelle.
  7. Run at Load est optionnel, vous décidez.
  8. A partir du côté droit, glissez-déposez StartInterval et définissez l’intervalle souhaité. Le FAQ sous le menu Aide est très bon.
2
Jose Leon