alogin – herramienta de gestión de acceso SSH con TUI, gateway multihop y almacén cifrado (Go)
(github.com/emusal)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).
SiAllowTcpForwardingestá 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,mde scripts existentes con una sola línea desource
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
¿No tiene soporte para Windows? T_T
No pude probarlo porque no tengo un entorno de Windows.
Sería bueno contar con capturas de pantalla de uso.
Agregué capturas de pantalla al README. Gracias por el consejo.