3 votos

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

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

Si lo cargo a través de launchctl conectado 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 forma de realizar mi tarea?

4voto

Nate Puntos 220

Me parece que el error de los permisos es sólo un síntoma de un problema mucho más profundo: estás intentando cargar el elemento en el lugar equivocado contexto de arranque de la máquina . Específicamente, estás ejecutando el comando launchctl como xyz, pero está tratando de cargar el elemento en el contexto de Root, que xyz no tiene permisos para hacer. Lo que usted quiere es cargar el elemento en el contexto de xyz en su lugar (lo que xyz debería tener permisos para hacer).

Ok, déjame retroceder un poco, y darte un resumen de la jerarquía de launchd en OS X. Cuando el SO arranca, inicia una instancia maestra de launchd (el launchd del "sistema"), que carga elementos de las distintas carpetas Library/LaunchDaemons.

Cuando un usuario se conecta (o inicia una "sesión"), se crea un nuevo "contexto de arranque", se inicia una nueva instancia de launchd (el launchd del "usuario") (en ese nuevo contexto) que carga elementos de las distintas carpetas Library/LaunchAgents (todo dentro de ese nuevo contexto).

Cuando se utiliza sudo -u xyz ... , cambia los ID de usuario a xyz, pero no cambia al contexto de xyz.

Ahora, hay un par de casos aquí: primero, si xyz no está conectado (es decir, no tiene una sesión activa), no tiene un contexto de arranque o una instancia de launchd, por lo que no puede cargar un LaunchAgent como ellos. Básicamente, los LaunchAgents se cargan en las sesiones de los usuarios, así que si no hay sesión no hay nada que cargar. 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 es conectado, puedes obtener el ID de proceso de algún proceso dentro de su sesión, y utilizar launchctl bsexec para cambiar al contexto de arranque de ese proceso (y luego usar sudo -u xyz para cambiar los UID a xyz, y luego cargar el artículo):

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

zx81 Puntos 36

He descubierto que se puede hacer en dos pasos.

Primero sudo en root

sudo -s

A continuación, suplantar al usuario

su -l user

Aparentemente eso establece el contexto correcto y launchctl funciona.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X