4 điểm bởi emusal 2026-03-22 | 4 bình luận | Chia sẻ qua WhatsApp

Từ đầu những năm 2000, tôi đã tự tạo và sử dụng công cụ tự động hóa SSH cá nhân bằng script Bash + Expect.
Sau 20 năm vá víu, cuối cùng tôi đã viết lại hoàn toàn bằng Go và phát hành mã nguồn mở.

https://github.com/emusal/alogin2

Vấn đề cốt lõi là: khi quản lý hàng chục máy chủ với người dùng, cổng, đường đi gateway và thông tin xác thực
đều khác nhau — tôi muốn dùng thuận tiện mà không phải gõ đầy đủ hostname mỗi lần hoặc lưu mật khẩu
dưới dạng văn bản thuần.

Các tính năng chính:

  • TUI (Bubbletea) với tìm kiếm mờ — không cần gõ đầy đủ hostname
  • Triển khai gateway đa hop bằng SSH native của Go (không cần ProxyCommand, không cần expect).
    Nếu AllowTcpForwarding bị tắt ở hop trung gian thì tự động fallback sang chuỗi shell
  • Lưu trữ thông tin xác thực được mã hóa — mật khẩu được lưu trong macOS Keychain / Linux Secret Service /
    file mã hóa age. Tuyệt đối không được ghi vào cơ sở dữ liệu SQLite
  • Phiên cluster — kết nối đồng thời tới N máy chủ bằng tmux, iTerm2, Terminal.app
  • Web UI — terminal xterm.js dựa trên WebSocket + dashboard quản lý máy chủ (alogin web)
  • Shell shim — có thể tiếp tục dùng nguyên các lệnh t, r, s, f, m trong script cũ chỉ với một dòng source

Stack sử dụng: Go 1.23, Bubbletea, golang.org/x/crypto/ssh, chi, xterm.js (React)

Phần thú vị nhất khi triển khai là SSH đa hop.
golang.org/x/crypto/ssh có thể dial hop tiếp theo ngay trên phiên hiện có, nên có thể chain N hop mà không cần tiến trình riêng.
Điểm khó là khi bastion trung gian chặn TCP forwarding — cần phát hiện lỗi trong lúc dial và chuyển sang
logic fallback bằng cách shell chaining.

Rất hoan nghênh các câu hỏi hoặc phản hồi về phần triển khai.

4 bình luận

 
nokdu 2026-03-22

Có hỗ trợ Windows không? huhu

 
emusal 2026-03-22

Tôi không có môi trường Windows nên chưa thử được.

 
runableapp 2026-03-22

Sẽ tốt hơn nếu có ảnh chụp màn hình sử dụng.

 
emusal 2026-03-22

Tôi đã thêm ảnh chụp màn hình vào README. Cảm ơn lời khuyên của bạn.