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