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

jueves, 4 de marzo de 2021

Iniciar sesión hacia una conexión de escritorio remoto sin cargar el entorno de escritorio local.

El objetivo de esta entrada es lograr que al iniciar la sesión en Linux nuestra máquina no cargue el escritorio local, sino que se conecte a una máquina remota y muestre su escritorio de forma automatica, de tal manera que el usuario inicie una sesión de escritorio remoto de forma transparente para él. La conexión puede ser mediante rdesktop/freerdp si la máquina remota es un Windows, o x2go/vnc si la máquina remota es Linux. Es lo que se llama "modo kiosko", en el que nuestro ordenador ejecuta una única aplicación que ocupa toda la pantalla.

La finalidad de este montaje es usar un PC muy antiguo y limitado en recursos como "terminal tonto" que conecte y abra sesión en otro que está sobrado de ellos. Esta sesión se abrirá ejecutando en pantalla completa la aplicación cliente de conexión, sin cargar ningún escritorio local, de manera que se minimicen los recursos usados en la máquina cliente. De esta manera no llegaremos al punto de optimización de los thinclients en un sistema LTSP como tenemos en las aulas, pero al menos podremos mezclar en un aula equipos modernos y equipos antiguos que se conecten y aprovechen la potencia de los primeros, aprovechando mejor los recursos disponibles.

Para evitar cargar un entorno de escritorio completo usaremos una funcionalidad que tiene lightdm de permitir ejecutar un script antes de iniciar sesión, de tal manera que este script ("session-wrapper") puede sustituir a la sesión normal. Para ello, tal como cuentan aquí, definimos este session-wrapper en el fichero lightdm.conf:
# cat /etc/lightdm.conf
[Seat:*]
...
session-wrapper = /usr/local/bin/lightdm-session-wrapper
...
Como dicen la documentación de lightdm: "session-wrapper is a the command to run for a session. This command is run as the user and needs to exec the command passed in the arguments to complete running the session. Use this if you need to do special setup for a user session. Note the default is 'lightdm-session' so you should chain to this if you need to override this setting"

En el fichero lightdm-session-wrapper tenemos:
# cat /usr/local/bin/lightdm-session-wrapper
#!/bin/bash

case "$USER" in
    "remoto") /usr/local/bin/kiosko.sh ;;
    *) $@ ;;
esac
Expliquemos:
  • Si el que inicia la sesión es el usuario llamado "remoto" (al cual debe existir, claro está), no se carga ningún escritorio y se lanza el script indicado. Incluso podria ser el usuario por defecto haciendo autologin si así lo deseamos.
  • En cualquier otro caso, la caga del escritorio se realiza normalmente con el comando "$@".
El contenido de kiosko.sh sería:
# cat /usr/local/bin/kiosko.sh 
#! /bin/bash

equipo="pc-destino"
usuario="usuario1"
comando="rdesktop -u $usuario -f $equipo"

if ping -c 1 $equipo &> /dev/null
then
  while true
  do
       rdesktop -u "gm_primero_remoto" -f  "$equipo"
       if zenity  --width=400 --question --text='¿Quieres salir y volver a la pantalla de inicio?' --title='Logout'
       then
            exit
       fi
   done
else
     zenity --info --width=400 --text="Parece que el ordenador $equipo no está encendido y no puedo conectar con él. Enciéndelo y vuelve a intentarlo"
     exit
fi
Indicamos un equipo al que conectar, un usuario (no es obligatorio, podemos dejarlo en blanco. También podemos indicar una contraseña para que se haga login automático en el puesto remoto) y un comando de conexión. Asumo que conectamos a un Windows y por eso usamos "rdesktop". También podríamos usar "freerdp", que tiene fama de ser mas rápido y completo. En ese caso el comando sería algo así como:
comando="xfreerdp /f -compression -toggle-fullscreen /u:$usuario /v:$equipo"
Por todo lo demás, lo que se hace es verificar que el equipo remoto está encendido y si lo está conectar a él en un bucle infinito hasta que digamos que no queremos continuar.

Sobre el espinoso tema de realizar la conexión hacia un Windows nos podemos preguntar: ¿es posible conectar varios usuarios a la vez mediante Remote Desktop sin expulsar al usuario que está trabajando?. En teoría no, pero en la práctica si, con ayuda de la aplicación de parcheo llamada RDP Wrapper. Como cada cierto tiempo Microsoft mete una actualización que fastidia el parche, la usaremos en combinación con RDP Wrapper & Autoupdate, que añade una tarea programada en el arranque que actualiza el parche cada vez que Windows toca algo.

Por supuesto, para Linux no hay problema en conectar varios usuarios de forma concurrente con, por ejemplo, x2go.

La solución Fucking Master pasa por seleccionar la conexión remota desde el mismo GRUB, al arrancar el equipo. El sistema viene descrito aquí. Se basa en crear un servicio alternativo a lightdm que carga directamente sin preguntar nada la sesión que lanza la conexión remota. Dicho servicio alternativo se ejecuta desde el GRUB mediante el uso de los parámetros systemd.mask y systemd.wants. No lo he implantado porque previsiblemente sería demasiado complicado para algunos de mis usuarios.


Tras los exitosos litofrenados de la SN8 y la SN9, el 3 de marzo SpaceX lanza la Starship SN10 a intentar de nuevo su arriesgada maniobra: subir 12Km, dejarse caer planeando en horizontal y aterrizar en vertical.

Y ayer lo hicimos:



La maniobra de aterrizaje fue un poco brusca, lo que causó un escape de metano y una explosión posterior, cuando ya estaba posada. Eso convierte la SN10 en la primera Starship que ha volado dos veces. Nos lo cuenta mejor en este enlace el incomparable Daniel Marín.