1 votos

Ejecutando un script como root y mostrando una interfaz gráfica a los usuarios que inician sesión

Estoy teniendo un problema de decisión de programación y espero que puedas mostrarme una solución o decirme si mi plan sobre cómo resolver el problema estaría bien o no.

Estoy administrando algunas Mac y quiero ejecutar un script cada vez que un usuario inicia sesión. El script (que aún no he escrito) necesita hacer algunos cambios (o no). Los cambios necesitan privilegios de administrador pero el script también necesita información del usuario que ha iniciado sesión (o está iniciando sesión).

Normalmente, este sería un trabajo para un LaunchAgent / Daemon, pero aquí viene el problema: Los scripts en /LaunchDeamons se ejecutan como administrador del sistema pero se inician junto con el sistema. No son conscientes de los inicios o cierres de sesión de los usuarios y es posible que no muestren una GUI. ~/LaunchAgents se ejecutan como el usuario que ha iniciado sesión y se inician cuando el usuario inicia sesión. También pueden mostrar una GUI. Sin embargo, no se ejecutan como administrador del sistema.

Así que este es mi problema: ejecutar un script como root, pero iniciarlo cada vez que un usuario inicia sesión y presentar una GUI a él: Mi solución sería escribir dos scripts:

Script 1 se ejecuta como administrador del sistema y se encuentra en /LaunchDeamons. Este tendría un Socket abierto para conexiones entrantes (también conocido como "Server Socket").

Script 2 se ejecuta como el usuario que está iniciando sesión y se encuentra en ~/LaunchAgents. Presenta una GUI al usuario y envía la información al script 1 a través de una conexión de socket.

No me parece que esta sea la solución más fiable / sencilla, pero no se me ocurre nada más. También intenté averiguar cómo otros programas resuelven este problema (como munki, que presenta una GUI al usuario pero instala programas como administrador del sistema) pero no pude entender cómo lo hicieron.

¡Estaría encantado de recibir algunos comentarios al respecto! Saludos, Christian

PD: Planeo usar python.

1voto

Steve Evans Puntos 155

Sockets - Implicados pero Probados y Testados

Tu solución de dos scripts comunicándose a través de un socket es el enfoque probado y testado. Hicimos esto para Power Manager y ha funcionado fiablemente desde OS X 10.3 hasta 10.11.

Puedes usar un socket tcp o de dominio unix para este propósito.

En nuestra situación, el demonio pmd se ejecuta como un proceso a nivel de computadora y el demonio de la sesión de usuario pmuser se ejecuta una vez por usuario. Hablan para compartir información que un demonio a nivel de computadora no puede obtener de forma segura y para realizar acciones dentro de sesiones de usuario específicas.

El demonio a nivel de computadora puede detectar cuando un usuario inicia sesión. Esto se realiza a través de la API SystemConfiguration SCDynamicStoreKeyCreateConsoleUser.

El script gráfico debe ser lanzado dentro de la sesión de usuario gráfica; un trabajo de launchd en /Library/LaunchDaemons con el par clave-valor LimitLoadToSessionType: Aqua configurado se asegurará de esto.

Dependiendo de la información que necesites recopilar del usuario, espero que lo que deseas lograr sea posible con Power Manager; no dudes en contactarnos.

bsexec de launchctl

Las versiones recientes de OS X incluyen un launchctl que promete lo que necesitas: la capacidad de lanzar un proceso dentro de una sesión de usuario. Consulta Cómo iniciar una aplicación GUI en la sesión gráfica de otro usuario para obtener los detalles y los problemas que probablemente encontrarás.

Si estás implementando en OS X 10.10 y posterior, investiga las nuevas capacidades de dominio de launchd. Una reescritura completa en OS X 10.10 abrió muchas opciones aún no completamente documentadas. La lista de correo de launchd es un tesoro de información.

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