Launchd: ejecute como si hubiera iniciado sesión como usuario usando sudo

¿Hay alguna forma de hacer esto?

Básicamente, estoy tratando de ejecutar un script que necesita iniciar un programa.

Poner el script /Library/LaunchDaemonsfunciona bien, pero todo se ejecuta como si fuera el usuario raíz. Esto no funciona porque necesita ejecutarse como si fuera un usuario real, pero usando el sudocomando.

Así que moví el script a ~/Library/LaunchDaemonspero ahora no iniciará el programa, presumiblemente porque se está ejecutando como usuario y no con sudopermisos.

Así que estoy atascado. Inicie sesión como usuario y vaya a una terminal y ejecute:

sudo my_command_which_launches_a_program

Funciona absolutamente bien, y exactamente como debe funcionar. Así que básicamente quiero emular eso, pero en un script Launchd, si es posible.

Gracias

¿Quiere decir que puso el script en los directorios mencionados o en la lista de lanzamiento?
Ah, lo siento, estoy hablando de un plist que ejecuta el script.

Respuestas (2)

Pones el plist en /Library/LaunchDaemons pero lo editas para decir con qué usuario se ejecutará el script

La clave que necesita agregar es UserName. Por ejemplo, ejecuto un servidor de noticias como usuario _news

<key>UserName</key>
<string>_news</string>

Documentado en la página man de launchd de Apple

A diferencia de LaunchAgents, LaunchDeamon no puede usar UserName. Se ejecutan sin iniciar sesión en un usuario.
@Julian, ¿dónde está documentado esto, y creo que solía funcionar, así que OS X cambia esto?
@JulianF.Weinert: simplemente ejecútelo como root. sudo launchctl .....para que su nombre de usuario sea utilizado por launchtl. Esto está documentado en la página del manual UserName <string> This optional key specifies the user to run the job as. This key is only applicable when launchd is running as root.
En macOS launchdsiempre se ejecuta como root. La página de manual solo cubre esto para sistemas que no son macOS.

necesita ejecutarse como si fuera un usuario real, pero usando el comando sudo

Creo que esto desmiente una falsa suposición que estás haciendo. Cuando un usuario ejecuta sudo foobar, el foobarcomando lo ejecuta el rootusuario.

Las únicas cosas que pueden ser diferentes cuando se ejecuta foobarcomo root (en lugar de que el usuario ejecute sudo foobar) son las variables de shell y de entorno disponibles, como $HOMEo $PATH.

Si su aplicación requiere una variable de entorno o shell específica, simplemente asegúrese de que el LaunchDaemon que está creando establezca esa variable de entorno o shell . Eso le ahorrará muchos dolores de cabeza al tratar de launchdreplicar la experiencia exacta de un usuario específico que ejecuta sudo foobar.

Para aquellos que votan negativamente , esta información se respalda varias veces en StackExchange aquí , aquí y aquí para empezar.