¿Hay alguna forma de cargar un LaunchAgent como otro usuario?

2

Desde un script ejecutado como root copio un LaunchAgent .plist a /Users/xyz/Library/LaunchAgents .

Si carga eso a través de launchctl registrado como usuario xyz , funciona sin problemas. Si intento cargarlo desde el script con el siguiente comando:

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

no funciona. El mensaje de error es

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

¿Hay alguna otra manera de realizar mi tarea?

    
pregunta Tycho Sjögren 24.08.2012 - 16:46

2 respuestas

4

Me parece que el error de permisos es solo un síntoma de un problema mucho más profundo: estás intentando cargar el elemento en el mal mach bootstrap context . Específicamente, está ejecutando el comando launchctl como xyz, pero está intentando cargar el elemento en el contexto de la raíz, por lo que xyz no tiene permisos para hacerlo. Lo que desea es cargar el elemento en el contexto de xyz en su lugar (para lo que xyz debería tener permisos)

Bien, déjame hacer una copia de seguridad un poco y te daré un resumen de la jerarquía launchd en OS X. Cuando arranca el SO, se inicia una instancia maestra de launchd (el "system" launchd), que se carga elementos de las diversas carpetas Library / LaunchDaemons.

Cuando un usuario inicia sesión (o inicia una "sesión"), se crea un nuevo "contexto de rutina de arranque", se inicia una nueva instancia de launchd (el "usuario" launchd) (en ese nuevo contexto) que carga elementos de las diversas carpetas de Biblioteca / Agentes de lanzamiento (todo dentro de ese nuevo contexto).

Cuando usas sudo -u xyz ... , cambia las ID de usuario a xyz, pero no cambia al contexto de xyz.

Ahora, hay un par de casos aquí: primero, si xyz no ha iniciado sesión (es decir, no tiene una sesión activa), no tienen un contexto bootstrap o una instancia launchd, por lo que puede ' t cargar un LaunchAgent como ellos. Básicamente, los agentes de inicio se cargan en las sesiones de usuario, por lo que si no hay sesión no hay nada para cargarlo. Por otro lado, esto no debería ser un problema: la próxima vez que xyz inicie sesión, su elemento se cargará automáticamente (siempre que esté en el lugar correcto).

Si xyz está conectado, puede obtener el ID de proceso de algún proceso dentro de su sesión y usar launchctl bsexec para cambiar al contexto de arranque del proceso (y luego usar sudo -u xyz para cambiar UID a xyz, y luego cargar el elemento):

loadUser=xyz
loadPID=$(ps -axj | awk "/^$loadUser / {print \;exit}")
launchctl bsexec $loadPID sudo -u $loadUser launchctl load /Users/xyz/Library/LaunchAgents/x.y.z.plist
    
respondido por el Gordon Davisson 25.08.2012 - 22:51
2

Descubrí que puedes hacer esto en dos pasos.

Primer sudo en root

sudo -s

Luego suplanta al usuario

su -l user

Aparentemente, eso establece el contexto correcto y launchctl funciona.

    
respondido por el Bill Waggoner 18.03.2014 - 16:43

Lea otras preguntas en las etiquetas