"Después del juego es antes del juego"
Sepp Herberger

lunes, 26 de septiembre de 2022

Lanzar de forma remota una aplicación dentro de la sesión gráfica del usuario.

En diferentes escenarios puede ser que tengamos que abrir una aplicación gráfica dentro del escritorio del usuario que ha iniciado la sesión sin estar fisicamente presentes en ese puesto. Esto va desde mostrar un mensaje al usuario con "zenity" o "notify-send" a abrir una aplicación concreta de forma automática en su escritorio en un momento dado.

Esto nos permitiría abrir una aplicación "mágicamente" en el escritorio del usuario desde una conexión ssh remota o desde un script lanzado desde crontab.

El truco está en que antes de ejecutar el comando que lanza la aplicación asignamos a las variables XAUTHORITY y DISPLAY los valores adecuados para entrometerse en la sesión abierta por el usuario que ha iniciado sesión físicamente en la máquina.

Una primera aproximación, muy burda, sería ejecutar, con el usuario root, estos comandos desde consola:
# export XAUTHORITY=/run/lightdm/root/:0 
# DISPLAY=:0 zenity --info --text "Ola ke ase"

Esto conecta con la sesión X iniciada con lightdm (el gestor de inicios de sesión) y muestra la ventana. El peligro que tiene esta forma es que el comando (zenity en este caso) se ejecuta como root, con los riegos que esto conlleva. En el caso de zenity en principio no hay mucho peligro, pero un programa como geany o un explorador de archivos abiertos como root en una sesión de usuario raso es bastante mas arriesgado.

La ventaja que tiene esté metodo es que permite mostrar la aplicación incluso si ningún usuario ha iniciado sesión, en la pantalla de login. Por ejemplo, puede ser util para mostrar mensajes en el escritorio haya o no sesión iniciada.

La otra aproximación, más ortodoxa, pasa por averiguar que usuario ha iniciado sesión en el escritorio y conectarnos con su sesión X en concreto. Los pasos son:
# comando='zenity --info --text "Ola ke ase"' # Programa a ejecutar
# user=$(who | grep "(:0)" | awk '{print $1}')) # Averiguamos que usuario ha iniciado sesión en el ordenador, 
# home_user=$(su usuario -c 'echo $HOME') # Averiguamos cual es su directorio home. Otra forma: home_user=$(getent passwd  usuario | cut -d":" -f6)
# export XAUTHORITY="$home_user/.Xauthority" # Accedemos a su fichero .Xauthority
# DISPLAY=:0 su $user -c $comando # Lanzamos el programa con la identidad del usuario

Todo este código anterior lo podemos meter un script que lancemos desde nuestra conexión ssh o desde un crontab u otro sistema de ejecución en background y con ello lograremos nuestro objetivo, para desconcierto del usuario que verá como se abren cosas de forma inesperada.

No hay comentarios:

Publicar un comentario