4 puntos por emusal 2026-03-22 | 4 comentarios | Compartir por WhatsApp

Desde principios de los 2000 he venido usando herramientas personales de automatización SSH hechas con scripts de Bash + Expect.
Después de 20 años parchándolas, al final las reescribí por completo en Go y las publiqué como open source.

https://github.com/emusal/alogin2

Problema principal que quería resolver: al administrar decenas de servidores con usuarios, puertos, rutas de gateway y credenciales
todos distintos, quería poder usarlos cómodamente sin tener que escribir cada vez el nombre completo del host ni guardar contraseñas
en texto plano.

Funciones principales:

  • Búsqueda difusa en TUI (Bubbletea): no hace falta escribir completo el nombre del host
  • Implementación de gateway multihop con SSH nativo de Go (sin ProxyCommand, sin expect).
    Si AllowTcpForwarding está desactivado en un salto intermedio, hace fallback automáticamente con encadenamiento de shell
  • Almacenamiento cifrado de credenciales: las contraseñas se guardan en macOS Keychain / Linux Secret Service /
    archivos cifrados con age. Nunca se registran en la base de datos SQLite
  • Sesiones de clúster: conexión simultánea a N servidores con tmux, iTerm2 y Terminal.app
  • Web UI: terminal xterm.js basada en WebSocket + dashboard de administración de servidores (alogin web)
  • Shim de shell: se pueden seguir usando tal cual los comandos t, r, s, f, m de scripts existentes con una sola línea de source

Stack usado: Go 1.23, Bubbletea, golang.org/x/crypto/ssh, chi, xterm.js (React)

La parte más interesante de la implementación fue el SSH multihop.
golang.org/x/crypto/ssh permite hacer dial al siguiente salto sobre una sesión existente, así que es posible encadenar N saltos sin procesos separados.
Lo complicado fue cuando un bastión intermedio bloquea el reenvío TCP: hubo que implementar una lógica de fallback que detecta la falla durante dial y cambia al método de encadenamiento de shell.

Bienvenidas las preguntas o el feedback sobre la implementación.

4 comentarios

 
nokdu 2026-03-22

¿No tiene soporte para Windows? T_T

 
emusal 2026-03-22

No pude probarlo porque no tengo un entorno de Windows.

 
runableapp 2026-03-22

Sería bueno contar con capturas de pantalla de uso.

 
emusal 2026-03-22

Agregué capturas de pantalla al README. Gracias por el consejo.