3 votes

Existe-t-il un moyen de charger un LaunchAgent en tant qu'autre utilisateur ?

A partir d'un script exécuté en tant que Root je copie un LaunchAgent .plist a /Users/xyz/Library/LaunchAgents .

Si je charge cela via launchctl connecté en tant qu'utilisateur xyz il fonctionne sans problème. Si j'essaie de le charger à partir du script avec la commande suivante :

sudo -u xyz launchctl load /Users/xyz/Library/LaunchAgents/x.y.z.plist

ça ne marche pas. Le message d'erreur est le suivant

Could not open job overrides database at /private/var/db/launchd.db/com.apple.launchd.peruser.0/overrides.plist: 13: Permission denied  
launch_msg(): Socket is not connected

Y a-t-il un autre moyen d'accomplir ma tâche ?

4voto

Gordon Davisson Points 30215

Il me semble que l'erreur d'autorisation n'est qu'un symptôme d'un problème beaucoup plus profond : vous essayez de charger l'élément dans le mauvais endroit. contexte d'amorçage de la machine . Plus précisément, vous exécutez la commande launchctl en tant que xyz, mais elle essaie de charger l'élément dans le contexte de Root, ce que xyz n'a pas le droit de faire. Ce que vous veulent est de charger l'élément dans le contexte de xyz à la place (ce que xyz devrait avoir la permission de faire).

Ok, laissez-moi revenir un peu en arrière, et vous donner un résumé de la hiérarchie de launchd dans OS X. Lorsque le système d'exploitation démarre, il lance une instance principale de launchd (le launchd "système"), qui charge les éléments des différents dossiers Library/LaunchDaemons.

Lorsqu'un utilisateur se connecte (ou démarre une "session"), un nouveau "contexte d'amorçage" est créé, une nouvelle instance de launchd (le launchd "utilisateur") est démarrée (dans ce nouveau contexte) qui charge les éléments des différents dossiers Library/LaunchAgents (tous dans ce nouveau contexte).

Lorsque vous utilisez sudo -u xyz ... il passe les identifiants de l'utilisateur à xyz, mais ne passe pas au contexte de xyz.

Il y a deux cas de figure : d'abord, si xyz n'est pas connecté (c'est-à-dire s'il n'a pas de session active), il n'a pas de contexte de démarrage ou d'instance launchd, donc vous ne pouvez pas charger un LaunchAgent pour lui. En fait, les agents de lancement sont chargés dans les sessions des utilisateurs, donc s'il n'y a pas de session, il n'y a rien à charger. D'un autre côté, cela ne devrait pas être un problème : la prochaine fois que xyz se connectera, votre élément sera chargé automatiquement (tant qu'il est au bon endroit).

Si xyz est connecté, vous pouvez obtenir l'ID d'un processus dans sa session, et utiliser launchctl bsexec pour basculer vers le contexte d'amorçage de ce processus (puis utiliser sudo -u xyz pour changer les UIDs en xyz, et ensuite charger l'élément) :

loadUser=xyz
loadPID=$(ps -axj | awk "/^$loadUser / {print \$2;exit}")
launchctl bsexec $loadPID sudo -u $loadUser launchctl load /Users/xyz/Library/LaunchAgents/x.y.z.plist

2voto

Bill Waggoner Points 121

J'ai découvert que vous pouvez le faire en deux étapes.

D'abord sudo dans root

sudo -s

Puis usurper l'identité de l'utilisateur

su -l user

Apparemment, cela établit le contexte correct et launchctl travaux.

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