Hay algunas formas de hacer esto. El inicio de sesión gráfico de Ubuntu es proporcionado por GDM (o KDM si está usando Kubuntu). GDM es iniciado por el subsistema Upstart.
El proceso de inicio sigue estos pasos:
- Sistema de botas. Upstart inicia servicios, incluidos GDM ( / etc / init / gdm ).
- Se inicia GDM, inicializa el servidor X ( / etc / gdm / Init / * ) y presenta la ventana de inicio de sesión de la GUI.
- Un usuario inicia sesión.
- La autorización PAM ocurre ( /etc/pam.d/gdm )
- GDM ejecuta el script PostLogin ( / etc / gdm / PostLogin / * ).
- GDM ejecuta el script PreSession ( / etc / gdm / PreSession / * ).
- GDM ejecuta scripts Xsession y xinit
( / etc / gdm / Xsession , /etc/X11/xinit/xinitrc.d/* , / etc / X11 / Xsession , /etc/X11/Xsession.d/* )
- Aparece el escritorio del usuario.
Dónde ejecutar tu script
Todo antes de XSession se ejecuta como root. / etc / gdm / Xsession y todo lo demás después se ejecuta como usuario. Esto te deja con tres opciones reales sobre dónde ejecutar tu script.
Modifique los scripts PostLogin o PreSession de GDM / KDM para ejecutar su programa. El nombre de usuario está disponible en las variables de entorno USER o USERNAME .
Usa PAM para ejecutar tu script. PAM establecerá el usuario autorizante en la variable de entorno PAM_USER . Agregue esto a /etc/pam.d/gdm para comenzar su script:
auth required pam_exec.so /path/to/your/script
- Es posible que pueda usar PAM para que coincida con un usuario en particular ( como en esta respuesta ), por lo que la secuencia de comandos solo se ejecutará para ese usuario y no será necesario que coincida con los propios usuarios. No tengo la experiencia PAM para explicar cómo hacer eso.
Escriba una secuencia de comandos Upstart para ejecutar su programa. Su secuencia de comandos comenzará en el inicio de sesión del usuario, por lo que buscamos la señal de inicio de sesión de escritorio emitida por la secuencia de comandos PreSession de GDM .
Entonces, un script Upstart detectaría esa señal como el disparador de ejecución:
# start when GDM's PreSession script runs
start on desktop-session-start
La señal de PreSession no pasa el nombre de usuario, por lo que necesitará ajustar la señal. En / etc / gdm / PreSession / Default , busque la línea initctl y cámbiela por esta. También puede usar USERNAME en lugar de USER .
# add USER variable so Upstart script can find it
initctl -q emit desktop-session-start DISPLAY_MANAGER=gdm USER=$USER
Consulte las páginas de manual de Upstart y su evento inicial para obtener más detalles.
Cómo evitar al usuario administrador
Su script necesitará examinar el usuario / nombre de usuario en las variables de entorno que obtiene de uno de estos métodos y usarlo para determinar si abortar o continuar. Los métodos estándar de script de shell funcionarán. Dependiendo de la ubicación de inicio que elija de la lista anterior, el nombre de usuario puede estar disponible en las variables de entorno USER , USERNAME o PAM_USER .