alogin – ferramenta de gerenciamento de acesso SSH com TUI, gateway multi-hop e armazenamento criptografado (Go)
(github.com/emusal)Desde o começo dos anos 2000, eu vinha criando e usando ferramentas pessoais de automação SSH com scripts Bash + Expect.
Depois de 20 anos aplicando patches, acabei reescrevendo tudo completamente em Go e publiquei como open source.
https://github.com/emusal/alogin2
A principal motivação foi esta: ao gerenciar dezenas de servidores com usuários, portas, rotas de gateway e credenciais todos diferentes, eu queria usar tudo com praticidade — sem precisar digitar sempre o hostname inteiro nem armazenar senhas em texto puro.
Principais recursos:
- TUI (Bubbletea) com busca fuzzy — não precisa digitar o hostname inteiro
- Implementação de gateway multi-hop com SSH nativo em Go (
ProxyCommandnão,expectnão).
SeAllowTcpForwardingestiver desativado em um hop intermediário, há fallback automático para encadeamento por shell - Armazenamento criptografado de credenciais — senhas guardadas no macOS Keychain / Linux Secret Service /
arquivo criptografado com age. Nunca são gravadas no banco SQLite - Sessão de cluster — conexão simultânea a N servidores com tmux, iTerm2 e Terminal.app
- Web UI — terminal xterm.js baseado em WebSocket + dashboard de gerenciamento de servidores (
alogin web) - Shim de shell — é possível continuar usando, com uma única linha de
source, os comandost,r,s,f,mde scripts existentes
Stack usada: Go 1.23, Bubbletea, golang.org/x/crypto/ssh, chi, xterm.js (React)
A parte mais interessante da implementação foi o SSH multi-hop.
O golang.org/x/crypto/ssh permite fazer dial do próximo hop sobre uma sessão existente, então é possível encadear N hops sem processos separados.
A parte mais delicada foi quando um bastion intermediário bloqueia o encaminhamento TCP — a lógica de fallback precisava detectar a falha durante o dial e mudar para o método de encadeamento por shell.
Perguntas sobre a implementação ou feedback são bem-vindos.
4 comentários
Não há suporte para Windows? 😢
Não pude testar porque não tenho um ambiente Windows.
Seria bom ter capturas de tela de uso.
Adicionei uma captura de tela ao README. Obrigado pelo conselho.