4 pontos por emusal 2026-03-22 | 4 comentários | Compartilhar no WhatsApp

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 (ProxyCommand não, expect não).
    Se AllowTcpForwarding estiver 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 comandos t, r, s, f, m de 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

 
nokdu 2026-03-22

Não há suporte para Windows? 😢

 
emusal 2026-03-22

Não pude testar porque não tenho um ambiente Windows.

 
runableapp 2026-03-22

Seria bom ter capturas de tela de uso.

 
emusal 2026-03-22

Adicionei uma captura de tela ao README. Obrigado pelo conselho.