9 votes

Comment faire pour que mon LaunchAgent fonctionne en tant que Root ?

Je veux exécuter un processus en tant que Root lors de la connexion de l'utilisateur.

J'ai créé /System/Library/LaunchAgents/eXist.plist avec rx—r—r— autorisations :

<?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>Disabled</key>
        <false/>
        <key>GroupName</key>
        <string>wheel</string>
        <key>Label</key>
        <string>eXist DB</string>
        <key>Program</key>
        <string>/Applications/eXist-db/bin/startup.sh</string>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/tmp/eXist DB.err</string>
        <key>StandardOutPath</key>
        <string>/tmp/eXist DB.out</string>
        <key>UserName</key>
        <string>root</string>
    </dict>
</plist>

Cependant, mon processus continue de s'exécuter en tant qu'utilisateur davea au lieu de Root. Que dois-je faire d'autre ?

J'utilise Mac 10.9.1.

8voto

klanomath Points 63400

Pour qu'un LaunchAgent utilisateur exécutant un script s'exécute en tant que Root, vous devez procéder comme suit :

Modifier les permissions du script. Ajoutez le script (ou la commande) au fichier sudoers dans le contexte de l'utilisateur et enfin ajoutez et chargez une plist d'agent de lancement appropriée.

Cette approche pourrait créer de graves failles de sécurité !


Dans l'exemple ci-dessous, j'utilise le fichier startup.sh d'eXit-db 2.2 :

  • Créer une liste de contrôle :

    <?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>Disabled</key>
        <false/>
        <key>Label</key>
        <string>org.eXist_DB</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/bin/sudo</string>
            <string>/Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/tmp/eXist_DB.err</string>
        <key>StandardOutPath</key>
        <string>/tmp/eXist_DB.out</string>
        <key>ThrottleInterval</key>
        <integer>10</integer>
    </dict>
    </plist>

    et l'enregistrer sous org.eXist_DB.plist dans ~/Bibliothèque/LaunchAgents

    La dernière clé :

        <key>ThrottleInterval</key>
        <integer>10</integer>

    pourrait ne pas être nécessaire. Dans ma VM, c'était le cas - pour des raisons inconnues.

  • Modifier les permissions de startup.sh :

    sudo chown root /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
    sudo chmod 4755 /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
  • Modifier le fichier sudoers :

    sudo visudo
  • ajouter une ligne pour permettre l'exécution d'une commande sans avoir besoin d'entrer le mot de passe sudo

    # User privilege specification
    root    ALL=(ALL) ALL
    %admin  ALL=(ALL) ALL

    ->

    # User privilege specification
    root    ALL=(ALL) ALL
    %admin  ALL=(ALL) ALL
    your_user_name ALL=(ALL) NOPASSWD: /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
  • Enfin, entrez :

    launchctl load -w ~/Library/LaunchAgents/org.eXist_DB.plist

    pour charger et démarrer l'agent de lancement

4voto

Graham Miln Points 39606

Ajouter la paire clé-valeur pour UserName :

<key>UserName</key>
<string>root</string>

Placer le fiche de travail launchd en /Library/LaunchDaemons/ ; le /System est réservé à l'usage exclusif d'Apple.

Pour que l'exécution se fasse sous l'égide de l'utilisateur spécifié, veillez à placer le ticket de travail dans le dossier LaunchDaemons . Comme le mentionne @Manu dans le commentaire ci-dessous, la UserName est ignorée pour les emplois en LaunchAgents .

1voto

Rich Trouton Points 4092

Utiliser un loginhook. Ils sont obsolètes mais fonctionnent toujours :

Mac OS X : Création d'un crochet de connexion

1voto

Quanlong Points 1801

Vous pouvez utiliser lancement-oneshot pour installer une tâche de connexion exécutée en tant que Root avec

brew install cybertk/formulae/launchd-oneshot
sudo launchd-oneshot <script> --on-login-as-root

1voto

fravelgue Points 1119

La création d'un agent de lancement qui s'exécute avec les privilèges sudo/Root peut être réalisée en ayant simplement sudo est la commande que l'agent de lancement exécute.

Création d'un fichier PList

Essayez de placer cet exemple minimal dans ~/Library/LaunchAgents/com.sudoexample.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.sudoexample</string>
        <key>ProgramArguments</key>
        <array>
            <string>sudo</string>
            <string>touch</string>
            <string>/tmp/sudoexample</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardOutPath</key>
        <string>/tmp/sudoexample.log</string>
        <key>StandardErrorPath</key>
        <string>/tmp/sudoexample.log</string>
    </dict>
</plist>

Remarque : les agents doivent normalement être propriétaires des fichiers de l'utilisateur, mais ils ne sont pas autorisés à les utiliser. <code>root</code> La propriété semble également fonctionner correctement.

L'exemple ci-dessus s'exécute sudo touch /tmp/sudoexample et enregistre la sortie sur /tmp/sudoexample.log .

Si vous exécutez launchctl load ~/Library/LaunchAgents/com.sudoexample.plist à ce stade, il échouera parce que sudo essaiera de demander un mot de passe et launchctl n'a pas d'associé tty pour servir l'invite de mot de passe :

$ ls /tmp/
sudoexample.log
$ cat /tmp/sudoexample.log
sudo: no tty present and no askpass program specified

Autoriser des privilèges élevés

Nous devons accorder à votre utilisateur l'autorisation d'exécuter sudo touch sans mot de passe.

Cela peut se faire de la manière suivante :

echo "$(whoami) ALL=(ALL) NOPASSWD: $(which touch)" | sudo tee /etc/sudoers.d/touch

Lorsque vous avez terminé, le fichier devrait ressembler à ceci :

$ sudo cat /etc/sudoers.d/touch
coryklein ALL=(ALL) NOPASSWD: /usr/bin/touch

Testez-le

$ launchctl load ~/Library/LaunchAgents/com.sudoexample.plist
$ ls -l /tmp
total 0
-rw-r--r-- 1 root      wheel 0 Jun 29 14:01 sudoexample
-rw-r--r-- 1 coryklein wheel 0 Jun 29 14:01 sudoexample.log

Vous pouvez maintenant voir que l'agent de lancement s'est exécuté avec succès en créant le fichier Root appartenant à /tmp/sudoexample .

Merci à <a href="https://apple.stackexchange.com/users/93229/klanomath">klanomath </a>pour avoir jeté les bases de celle-ci.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X