alogin – เครื่องมือจัดการการเชื่อมต่อ SSH พร้อม TUI, เกตเวย์แบบมัลติฮอป และคลังเก็บข้อมูลเข้ารหัส (Go)
(github.com/emusal)ตั้งแต่ช่วงต้นทศวรรษ 2000 ผมได้สร้างและใช้งานเครื่องมือทำ SSH อัตโนมัติส่วนตัวด้วยสคริปต์ Bash + Expect มาโดยตลอด
หลังจากค่อย ๆ แพตช์มันมานาน 20 ปี ในที่สุดก็เขียนใหม่ทั้งหมดด้วย Go และเปิดซอร์สเป็นโอเพนซอร์สแล้ว
https://github.com/emusal/alogin2
แนวคิดหลักของปัญหาที่อยากแก้คือ: เมื่อจัดการเซิร์ฟเวอร์หลายสิบเครื่องที่มีผู้ใช้ พอร์ต เส้นทางเกตเวย์ และข้อมูลรับรองแตกต่างกันไปทั้งหมด — ผมอยากให้ใช้งานได้สะดวกโดยไม่ต้องพิมพ์ชื่อโฮสต์เต็มทุกครั้งหรือเก็บรหัสผ่านไว้แบบ plain text
ฟีเจอร์หลัก:
- TUI (Bubbletea) ค้นหาแบบฟัซซี — ไม่จำเป็นต้องพิมพ์ชื่อโฮสต์ครบทั้งหมด
- มัลติฮอปเกตเวย์ด้วย Go native SSH (ไม่มี ProxyCommand, ไม่มี expect)
หากAllowTcpForwardingถูกปิดที่ฮอประหว่างทาง จะ fallback ไปใช้ shell chaining โดยอัตโนมัติ - ที่เก็บข้อมูลรับรองแบบเข้ารหัส — รหัสผ่านจะถูกเก็บไว้ใน macOS Keychain / Linux Secret Service /
ไฟล์เข้ารหัส age และจะไม่ถูกบันทึกลงใน SQLite DB เด็ดขาด - คลัสเตอร์เซสชัน — เชื่อมต่อพร้อมกันไปยังเซิร์ฟเวอร์ N เครื่องด้วย tmux, iTerm2, Terminal.app
- Web UI — เทอร์มินัล xterm.js บน WebSocket + แดชบอร์ดจัดการเซิร์ฟเวอร์ (
alogin web) - shell shim — สามารถใช้คำสั่ง
t,r,s,f,mจากสคริปต์เดิมต่อได้ทันทีด้วยsourceเพียงบรรทัดเดียว
สแตกที่ใช้: Go 1.23, Bubbletea, golang.org/x/crypto/ssh, chi, xterm.js (React)
ส่วนที่น่าสนใจที่สุดระหว่างการพัฒนาคือมัลติฮอป SSH
golang.org/x/crypto/ssh สามารถ dial ฮอปถัดไปบนเซสชันเดิมได้ จึงทำ chaining แบบ N-hop ได้โดยไม่ต้องมีโปรเซสแยก
สิ่งที่ยากคือกรณีที่ bastion ตรงกลางบล็อก TCP forwarding — ต้องตรวจจับความล้มเหลวระหว่าง dial และสลับไปใช้ตรรกะ fallback แบบ shell chaining
ยินดีรับคำถามเกี่ยวกับการพัฒนาหรือฟีดแบ็กครับ
4 ความคิดเห็น
รองรับ Windows ไหมครับ ฮือๆ
ยังไม่ได้ลองเพราะไม่มีสภาพแวดล้อม Windows
น่าจะดีถ้ามีภาพหน้าจอการใช้งานครับ
ผมได้เพิ่มภาพหน้าจอใน README แล้ว ขอบคุณสำหรับคำแนะนำครับ