Evilham

Evilham.com

Presentando en la terminal

Introducción

En tiempos de Pandemia, los encuentros sociales son principalmente digitales, esto incluye también encuentros técnicos, en el contexto de “cosas de ordenadores”.

En los últimos meses hemos hecho talleres regulares de cdist, y también algún curso de IPv6 con MaadiX.

Como la mayoría de contenido es texto, las herramientas habituales para compartir pantalla no son ideales. Esto se debe a que estas herramientas no transmiten el texto, sino que transmiten vídeo; es decir, imágenes comprimidas (simplificando un poco).

Al enviar vídeo, tenemos varios problemas:

  • Cada persona espectadora no puede configurar la fuente a sus necesidades / preferencias
  • Se requiere un ancho de banda bastante superior
  • Si la calidad de la conexión no es perfecta, esto puede resultar en que la herramienta usada baje la calidad y el texto sea ilegible

Así que, como siempre, hacemos las cosas diferente. A petición “popular”, vamos a ver cómo.

Tabla de contenido

Una terminal

Lo hacemos todo desde una terminal. La mayoría de personas involucradas están cómodas con la línea de comandos; y las que no, están cómodas leyendo documentación, así que es una elección bastante correcta.

Varias terminales (en una): tmux

Una terminal única puede ser algo limitante, así que usamos tmux. Un “multiplexor” de terminal.

Para la persona que lo está usando, es como si hubiera una única terminal, pero realmente, con Ctrl+b+c podemos cear una nueva terminal y con Ctrl+b+n y Ctrl+b+p respectivamente podemos movernos a la terminal siguiente (next) o la anterior (previous).

Para instalar tmux podemos usar habitualmente los paquetes del sistema. En sistemas como OpenBSD, no hace falta porque está incluido en el sistema base :-).

Compartiendo la terminal: GoTTY

Esta es la parte interesante, después de evaluar varias opciones, GoTTY es la que mejor configuración por defecto tenía y la que más control permitía a la persona usuaria.

Para instalar GoTTY en FreeBSD podemos usar pkg install gotty; en otros sistemas este paquete puede no estar disponible, pero hay versiones pre-compiladas en su repositorio. Ante la duda, compilar binarios de Go es sencillo :-). (Y hay instrucciones en la web de GoTTY)

Integración con tmux

Este es el contenido de mi configuración de tmux, en ~/.tmux.conf:

# Activar y desactivar barra con: Ctrl+F3
bind-key -n C-F3 set-option -g status
# Compartir la sessión con GoTTY con: Ctrl+F2
bind-key -n C-F2 new-window -n ttyshare "gotty tmux attach -r -t \\$(tmux display -p '#S')"

Si nos fijamos, con esta configuración añado dos atajos de teclado:

  • Ctrl+F3: para activar y desactivar la barra de estado de tmux
  • Ctrl+F2: para empezar a compartir la sesión de tmux con GoTTY.

Analicemos un poco más la línea:

bind-key -n C-F2 new-window -n ttyshare: Cuando se presione Ctrl+F2 Crear una nueva “ventana” de tmux llamada ttyshare.

Y en esa nueva “ventana” ejecutaremos el comando: gotty tmux attach -r -t $(tmux display -p '#S')

Esto significa que GoTTY empezará a ejecutarse, y para cada cliente que se conecte, se ejecutará: tmux attach -r -t $(tmux display -p '#S')

Excepto que… tmux reemplaza '#S' con el nombre de la sesión actual, es decir, donde presionamos Ctrl+F2

De esta forma, para cada persona que visite la dirección de GoTTY, empezaremos un tmux al que le decimos: “conéctate a la sesión donde presionamos Ctrl+F2 de forma sólo lectura”. Para obtener el efecto sólo lectura, usamos -r como argumento de tmux attach.

Vale la pena mencionar que: por defecto GoTTY también crea sesiones de sólo lectura, al hacerlo aquí también, conseguimos seguridad por capas: para comprometer nuestra sesión, haría falta que haya un problema en GoTTY y también que haya un problema en tmux.

Así, al presionar Ctrl+F2, se crea la ventana ttyshare y vemos lo siguiente:

2020/11/08 23:06:43 Loading config file at: ${HOME}/.gotty
2020/11/08 23:06:43 Server is starting with command: tmux attach -r -t $0
2020/11/08 23:06:43 URL: http://[::1]:8080/17lmim3q/

Es decir, que dese el navegador, puedo abrir la dirección http://[::1]:8080/17lmim3q/ y ver, en vivo, mi sesión de tmux

Configurando GoTTY

A este programa no le hace falta mucha configuración porque los valores por defecto son bastante razonables, pero hay alguna cosa que sí prefiero cambiar.

A partir de la configuración completa:

// [string] Address to listen, all addresses will be used when empty
//
// Limitar conexiones a la máquina local, via IPv6:
address = "::1"

// [bool] Enable random URL generation
//
// De esta forma, tenemos una capa de seguridad más, al requerir compartir
// un enlace con las personas que queremos compartir la terminal.
enable_random_url = true

// [string] Title format of browser window
//
// Aquí podemos personalizar el título de la pestaña en el navegador
title_format = "Hola!"

// [int] Timeout secodns for waiting a client (0 to disable)
//
// Por defecto, si no se conecta un cliente en 60 segundos, GoTTY se cierra
// esto es poco práctico si lo configuramos todo y esperamos a las otras
// personas. Al ponerlo a "0", desactivamos esta desconexión
timeout = 0

Usándolo con otras personas: Nginx como reverse proxy + TLS

Si nos fijamos, configuro GoTTY para escuchar únicamente en la máquina local via IPv6.

Justamente esto no es lo que queremos, si no que queremos que otras personas puedan acceder a nuestra terminal. Si no usamos cifrado en el transporte (TLS), nuestra comunicación es como una postal, cualquiera puede leerla.

Este trabajo lo hace nginx mucho mejor que lo podría hacer GoTTY, además ya tenemos una serie de automatizaciones para obtener certificados con Let’s Encrypt, así que es ideal usarlo para recibir las llamadas del mundo exterior y pasarlas a GoTTY.

Esto es bastante estándard, excepto que tenemos que tener en cuenta que GoTTY usa Web Sockets para actualizar las terminales de los clientes en “tiempo real”:

        location ~ /sh(/[^/]+)?/ws {
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "Upgrade";

                proxy_set_header Host              $host;
                proxy_set_header X-Real-IP         $remote_addr;
                proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;

                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-Port  443;

                proxy_pass https://MyComputerHost;
        }

        location /sh/ {
                proxy_set_header Host              $host;
                proxy_set_header X-Real-IP         $remote_addr;
                proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;

                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-Port  443;

                proxy_pass https://MyComputerHost;
        }

De esta forma, puedo enviar enlaces del tipo: https://evilham.com/sh/17lmim3q/ y las personas que lo reciban podrán seguir lo que sea que tenga en la terminal.

“Diapositivas” en la terminal: patat

También hay muchas alternativas de programas o utilidades para hacer presentaciones en la terminal, pero todas tenían algún tipo de inconveniente lo suficientemente grande como para no ser prácticas.

Todas excepto patat, que consigue hacerlo todo bien por defecto.

Sólo hace falta escribir Markdown, y ejecutar patat presentacion.md y ya estamos presentando con nuestras fantásticas diapositivas.

Para instalar esta herramienta en Linux, podemos usar algunos paquetes, o descargar el binario precompilado desde su repositorio.

Es posible que me anime a crear un port para FreeBSD pronto ^^.

Otras cosas: editando texto, …

Al interactuar con nuestros humanos seguro que salen dudas, o queremos comprobar un manual, o queremos mirar un fichero, o queremos entrar en una máquina remota, …

¿Lo mejor de estas presentaciones? Al hacerlo todo en una única sesión de tmux, podemos rápidamente presionar Ctrl+b+c, usar las herramientas habituales (man, vim, ssh, …) y volver a la presentación; y nuestros humanos sabrán de qué hablamos.

Conclusión

Estas herramientas son bastante sencillas, y una vez las hemos configurado, le dan a las otras personas plena flexibilidad a la hora de configurar el tamaño de letra y demás, y a nosotros también a la hora de salirnos un poco de lo que habíamos preparado.

No es para todas las presentaciones, pero para muchas… Seguro que es más eficiente y agradable ^^.