Ejecutando un script como root y presentando una GUI para iniciar sesión en los usuarios

1

Tengo un problema de decisión de programación y espero que pueda mostrarme una solución o decirme si mi plan sobre cómo resolver el problema sería correcto o no.

Estoy administrando algunos macs 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 la secuencia de comandos también necesita información del usuario que ha iniciado sesión (o ha iniciado sesión).

Normalmente, esto sería un trabajo para un LaunchAgent / Deamon, pero aquí viene el problema: los scripts en / LaunchDeamons se ejecutan como administradores del sistema, pero comienzan junto con el sistema. No están al tanto de los usuarios que inician o cierran sesión y es posible que no muestren una GUI. ~ / LaunchAgents se ejecuta como el usuario que inició sesión y se inicia cuando el usuario inicia sesión. También pueden mostrar una GUI. Sin embargo, no se ejecutan como administrador del sistema.

Este es mi problema: ejecutar un script como root, pero iniciarlo cada vez que un usuario inicia sesión y le presenta una GUI: mi solución sería escribir dos scripts:

El script 1 se ejecuta como administrador del sistema y se encuentra en / LaunchDeamons. Esto tendría un Socket abierto para conexiones entrantes (también conocido como "Socket de servidor").

El script 2 se ejecuta cuando el usuario ha iniciado 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 sea la solución más confiable / directa, pero no puedo pensar en otra cosa. También intenté descubrir cómo otros programas resuelven este problema (munki, por ejemplo, que presenta una GUI al usuario pero instala programas como administrador del sistema) pero no pude averiguar cómo lo hicieron.

¡Me encantaría recibir algunos comentarios sobre esto! Saludos, Christian

PS: planeo usar python.

    
pregunta Christian 04.09.2015 - 19:15

1 respuesta

1

Sockets - Involucrados pero probados y probados

Su solución de dos scripts hablando a través de un socket es el enfoque probado y comprobado. Hicimos esto para Power Manager y ha funcionado de manera confiable desde OS X 10.3 - 10.11.

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

En nuestra situación, el daemon pmd se ejecuta como un proceso de todo el equipo y el daemon de sesión de usuario pmuser se ejecuta una vez por usuario. Hablan para compartir información de que un demonio informático no se puede obtener con seguridad y realizar acciones dentro de sesiones de usuario específicas.

El daemon de todo el equipo puede detectar cuando un usuario inicia sesión. Esto se realiza a través de la API de configuración del sistema SCDynamicStoreKeyCreateConsoleUser .

El script gráfico debe iniciarse dentro de la sesión gráfica del usuario; un trabajo launchd en /Library/LaunchDaemons con el par de valores clave LimitLoadToSessionType : Aqua set asegurará esto.

Dependiendo de la información que necesite recopilar del usuario, espero que lo que quiera lograr sea posible con Power Manager; no dude en ponerse en contacto .

bsexec de launchctl

Las versiones recientes de OS X incluyen un launchctl que promete lo que necesita: la capacidad de iniciar un proceso dentro de una sesión de usuario. Consulte Cómo iniciar una aplicación GUI en ¿La sesión gráfica de otro usuario? para conocer los detalles y los posibles problemas con los que se encontrará.

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

    
respondido por el Graham Miln 04.09.2015 - 19:40

Lea otras preguntas en las etiquetas