Cách quản lý 50+ server Linux và VM cloud từ một máy Mac

Để quản lý nhiều server SSH trên Mac với 50+ server và VM cloud, hãy nhóm host, lưu mật khẩu trong keychain hệ thống và đọc số CPU, RAM, disk trực tiếp mà không cài agent lên từng máy. SSH Host Manager của MXterm Pro làm việc này trên kết nối OpenSSH thật. Gói Free mặc định lưu 5 host; Pro bỏ giới hạn.
Hướng dẫn này dành cho ai
Hướng dẫn này dành cho người vận hành hạ tầng backend trên AWS, Google Cloud, DigitalOcean, Hetzner hoặc bare metal. Thường đó là số host nhiều hơn mức bạn nhớ nổi, chia thành production, staging và vài máy dev dùng một lần.
Nếu bạn chỉ quản lý một hai server, một tab Terminal.app thường cùng ~/.ssh/config vẫn là công cụ đơn giản nhất. Các cách tổ chức bên dưới (nhóm, lọc, broadcast và telemetry) bắt đầu có giá trị khi bạn phải xoay xở với một chục host trở lên và không nhớ nổi tab nào là máy nào.
Quản lý SSH host theo nhóm và lọc hàng chục host
Bấm ⌘⇧H để mở SSH Host Manager. Mỗi host bạn thêm có tên, địa chỉ, cổng, username và một trong ba kiểu xác thực: mật khẩu, file private key hoặc keyboard-interactive. Hầu hết phím tắt, kể cả phím này, có thể gán lại trong Cài đặt → Shortcuts. Zoom, ⌘, ⌘1 đến ⌘9 và vài phím khác thì cố định.
Mỗi host thuộc đúng một nhóm. Có sẵn sáu nhóm (Production, Staging, Testing, Cloud / VPS, Internal / VPN, Development) và bạn có thể thêm nhóm riêng. Một hàng chip lọc phía trên danh sách host hiển thị số đếm trực tiếp cạnh mỗi nhóm.
Bấm "Production (14)" và danh sách 50 host thu lại còn những host có thể gây hại nếu bạn gõ nhầm. Đây là tập bộ lọc nhóm phẳng, không phải cây thư mục lồng nhau. Không có ô tìm kiếm tự do tách riêng khỏi các bộ lọc đó, nên đừng mong có gì sâu hơn.
Nếu bạn để server trong ~/.ssh/config, nút Import đọc các dòng Host, HostName, User, Port và IdentityFile, rồi xếp chúng vào nhóm "Imported" trong một lần. Cùng nút đó đọc file phiên MobaXterm (chỉ các session SSH, xếp vào nhóm "MobaXterm") và file xuất profile iTerm2 (các profile có lệnh là một dòng ssh thuần, xếp vào nhóm "iTerm2"). Trên Mac, tab Xuất / Nhập Kịch Bản của Session Manager cũng quét được profile iTerm2.
Tên nhóm đó ("MobaXterm" hoặc "iTerm2" với các lần nhập đó) hiện thành badge trên mỗi host, nhưng hàng lọc chỉ liệt kê sáu nhóm mặc định và các nhóm bạn tự thêm, nên hãy thêm một nhóm cùng tên nếu muốn lọc theo nó. Trên Pro, một file config 50 host thành một lần import thay vì năm mươi form. Trên Free, import dừng ở giới hạn 5 host.
Importer không parse ProxyJump hay các directive nâng cao khác. Phần sau sẽ nói thêm.
Mật khẩu và key của bạn thực sự được lưu ở đâu
Mật khẩu SSH được lưu vào kho credential của hệ điều hành (Keychain của macOS trên Mac) dưới tên service com.mxterm.desktop.ssh, khóa theo host id. Passphrase của key không được lưu: app loại bỏ nó trước khi ghi danh sách host, và nó không bao giờ tới kho credential của hệ điều hành. Windows Credential Manager đã được nối vào, nhưng SSH trên Windows chưa xác minh.
Không có thông tin bí mật nào được ghi vào file cài đặt cục bộ của MXterm Pro. Host đã lưu từ bản cũ mà vẫn còn mật khẩu dạng plaintext sẽ được ghi lại không kèm mật khẩu ở lần tải tiếp theo.
Đường dẫn file key như ~/.ssh/id_ed25519 không phải bí mật, chỉ là một đường dẫn, nên riêng trường đó nằm trong danh sách host thường. Điều này giống những gì bạn thấy trong ~/.ssh/config.
Vì sao kết nối lại cùng một server gần như tức thì
Trên macOS, mỗi kết nối SSH mà MXterm Pro mở đều mang ba tùy chọn: ControlMaster=auto, ControlPath=~/.mxterm/sockets/%r@%h:%p và ControlPersist=10m. Đây là connection multiplexing thật của OpenSSH, không phải cơ chế tự viết.
Kết nối đầu tiên tới một host mở một master socket. Các kết nối sau tới cùng host, như tab terminal thứ hai hoặc panel SFTP, dùng lại socket đó, và master còn sống 10 phút sau khi kết nối cuối đóng. Nhờ vậy bỏ qua được một lần TCP handshake và một vòng xác thực mới. Đổi cài đặt kết nối của một host đã lưu hoặc xóa host sẽ đóng kết nối dùng chung của nó, và panel file hiện nút Đặt lại kết nối khi server từ chối đăng nhập hoặc yêu cầu mật khẩu mới.
Điều này cũng sửa một vấn đề với host xác thực bằng mật khẩu. BatchMode=yes nghĩa là SFTP không tự hỏi mật khẩu được, nên nếu không có master socket dùng chung, host dùng mật khẩu sẽ kết nối được ở tab terminal nhưng lỗi ở trình duyệt file. Chia sẻ ControlPath cho phép panel SFTP đi nhờ phiên bạn đã xác thực trong một terminal pane.
Chạy lệnh trên nhiều server cùng lúc (Broadcast Mode)
⌘⇧B bật Broadcast Mode với mọi pane của tab hiện tại đã nằm sẵn trong nhóm. Option/Alt+Click một pane để bỏ nó ra hoặc đưa lại vào. Clear làm trống nhóm và Select all thêm lại tất cả. Một banner cố định ghi "Broadcast ON · N panes" luôn hiện trên màn hình. Phím gõ vào bất kỳ pane nào trong nhóm sẽ đi tới tất cả, theo thứ tự layout.
Hãy kiểm tra hai điều trước khi dựa vào nó cho 50 server. Nhóm ban đầu là mọi pane trong tab hiện tại, nên hãy thu hẹp trước khi gõ, và nó chỉ tới các pane của tab đó, không phải mọi kết nối đang mở. Ngoài ra không có bước xác nhận cho từng phím khi đã bật, vì mục đích là gõ một lần và lệnh đi tới mọi nơi.
Lớp an toàn là cái banner, rất khó bỏ sót. Clear bỏ cả nhóm và Esc thoát ngay lập tức. Hãy dựng nhóm cẩn thận như khi bạn chạy pssh hoặc pane đồng bộ của tmux lên một cụm server production, vì công cụ sẽ không ngăn bạn broadcast nhầm tới sáu server sai.
Xem CPU, RAM, disk server trực tiếp mà không cần agent giám sát
Server Telemetry HUD nằm ở chân tab SSH và hiển thị CPU %, RAM %, disk % và uptime, tô màu xanh lá, vàng cam hoặc đỏ khi vượt 65% và 85%. Nó tự làm mới mỗi 20 giây, và nút làm mới thủ công cho bạn con số ngay lúc đó.
Mỗi lần làm mới chạy một one-liner python3 -c "..." ngắn hạn qua kết nối SSH sẵn có của bạn. Nó đọc tải CPU từ os.getloadavg() so với số core, bộ nhớ từ /proc/meminfo, disk từ shutil.disk_usage('/') và uptime từ /proc/uptime, rồi thoát. Không cài gì và không có gì chạy thường trú trên server.
Yêu cầu duy nhất là host từ xa có python3. Nhiều image server có sẵn nó, nhưng các image tối giản như Alpine thường không có. Thiếu nó thì thanh thống kê để trống: lệnh uptime mà nó cũng thử không cho trường nào dùng được, và MXterm Pro không hiện số nào thay vì hiện số bịa ra. RAM được đọc từ /proc/meminfo, nên server macOS hoặc BSD hiện dấu gạch thay vì phần trăm cho RAM.
Jump host và bastion thì sao?
Một host đã lưu có trường Jump Host / Bastion (bạn có thể nối nhiều host, cách nhau bằng dấu phẩy) cùng tùy chọn Chuyển tiếp SSH agent. Kết nối được dựng thành argv ssh thật với -J và -A đặt tương ứng.
Importer ~/.ssh/config không điền trường đó giúp bạn. Khi đọc file này, nó chỉ lấy HostName, User, Port và IdentityFile, còn dòng ProxyJump bị bỏ qua chứ không được chuyển đổi. Profile iTerm2 có lệnh ssh -J bastion host thì mang theo cả jump host của nó. Với host nhập từ ~/.ssh/config hoặc MobaXterm, hãy tự đặt jump host một lần, trong form của chính host đó.
Hoặc, terminal pane là một PTY thật. Nếu ~/.ssh/config của bạn có mục Host prod-db với dòng ProxyJump bastion, gõ ssh prod-db vào một shell pane thường sẽ theo đúng config đó, y như Terminal.app.
Cách đó sẽ không cho bạn nhãn nhóm hay thanh thống kê server của host ấy.
Broadcast chỉ tới các pane của một tab. Tab mở từ SSH Host Manager gắn với đúng một host, nên để gõ vào nhiều server cùng lúc, hãy mở các shell pane thường trong một tab, chạy ssh <alias> trong từng pane rồi broadcast tới chúng. Free không giới hạn số pane.
Free và Pro: quản lý 50 server thực tế tốn gì
Đây là con số quan trọng nhất cho trường hợp này: gói Free giới hạn bạn ở 5 SSH host đã lưu. Nhóm, import, multiplexing, broadcast và telemetry hoạt động giống hệt trên Free và Pro. Bạn chỉ không lưu được 50 host nếu không có Pro, nơi số host không giới hạn.
Cùng ranh giới Free và Pro này chạy xuyên suốt phần còn lại của app. Free không giới hạn số pane. Free giới hạn Control Room (trước đây là War Room) ở 2 thành viên mỗi room (Pro không giới hạn thành viên) và lưu 1 Machine.
Không thứ nào trong số này là bắt buộc để quản lý 50 server. Nó chỉ liên quan nếu bạn còn chạy Claude Code, Codex hoặc Gemini CLI trên các server đó cùng lúc với phiên SSH.
So sánh với iTerm2, Warp, Termius và MobaXterm cho một cụm server
iTerm2 là terminal emulator lâu đời, miễn phí, chỉ có trên macOS, với tích hợp tmux xuất sắc và quản lý profile. Profile cùng trình quản lý mật khẩu dùng Keychain của nó bao được khá nhiều, nhưng nó không có sẵn SSH host manager riêng với bộ lọc nhóm hay telemetry HUD. Bạn sẽ phải tự ghép từ tmux, dotfile và các công cụ giám sát riêng.
Warp là terminal hiện đại có AI ngay trong cùng cửa sổ với shell. Đây là lựa chọn mạnh nếu bạn muốn AI giúp viết lệnh và chạy agent. Nó không được xây quanh hàng chục SSH host đã lưu kèm nhóm và thống kê server. MXterm Pro được xây cho nhiều agent trong các split pane.
Termius là đối thủ gần nhất ở đây. Đồng bộ SSH host giữa các thiết bị, app di động và trình tổ chức host trưởng thành là thế mạnh thật, và nếu bạn cần danh sách host trên điện thoại thì nó phù hợp hơn. Nó không chạy nhiều AI coding agent cạnh nhau và không tạo git worktree cho từng agent.
MobaXterm vẫn là công cụ sâu nhất cho những ai dùng Windows và cần X11 forwarding cùng tunneling bên cạnh SSH, nhưng nó không có bản macOS và không điều phối AI agent.
Multi-Agent Control Room của MXterm Pro chạy nhiều agent (Claude Code, Codex, Gemini CLI và các agent khác) trong split pane. Khi bật cô lập worktree, mỗi agent pane có git worktree riêng tại <repo>/.worktrees/<slug>, giúp giảm khả năng lỗi của agent này chạm vào bản làm việc của agent kia.
⌘J Command Recipes so những gì bạn gõ với một bộ lệnh Linux dựng sẵn có trong app. Đây là khớp từ khóa, không phải model viết bash.
Bắt đầu
Tải MXterm Pro và thử SSH Host Manager với bao nhiêu host bạn đang có. Nhóm, import, multiplexing, broadcast và telemetry HUD đều có trong gói Free.
Rào cản bạn sẽ chạm với một cụm 50 server thật là giới hạn 5 host đã lưu. Pro với số host không giới hạn giúp bạn vượt qua nó.
Terminal đa pane, Command Recipes (Cmd+J), và Control Room (trước đây là War Room) đa agent: miễn phí để bắt đầu.
Đã có MXterm Pro? Đọc hướng dẫn cài đặt →
Chưa dùng MXterm Pro? Xem bảng giá →
Câu hỏi thường gặp
Mật khẩu SSH đã lưu được đưa vào kho credential của hệ điều hành (Keychain của macOS trên Mac) dưới tên service com.mxterm.desktop.ssh, không nằm trong file cài đặt của app. Passphrase của key không được lưu. Đường dẫn file key (~/.ssh/id_ed25519) không phải bí mật nên nằm trong danh sách host. Panel file, chuyển file và thanh thống kê dùng BatchMode=yes và không hỏi mật khẩu được, khác với terminal pane.
Có. ⌘⇧B bật nó với mọi pane của tab hiện tại nằm trong nhóm. Option/Alt+Click bật hoặc tắt một pane, Clear làm trống nhóm và Select all thêm lại tất cả. Banner cố định "Broadcast ON · N panes" luôn hiện và Esc thoát ngay. Không có xác nhận cho từng phím, nên hãy thu hẹp nhóm trước. Lớp an toàn là một banner rất khó bỏ sót và dễ xóa, chứ không phải một hộp thoại hỏi.
Không. Gói Free giới hạn 5 SSH host đã lưu, và Pro bỏ giới hạn đó. Nhóm, lọc, import, multiplexing, broadcast và telemetry HUD hoạt động như nhau ở cả hai gói. Số host là giới hạn mà một cụm 50 server sẽ chạm tới.
Không có agent thường trú. Mỗi lần làm mới chạy một one-liner python3 ngắn hạn qua kết nối SSH sẵn có để đọc tải CPU, /proc/meminfo, mức dùng disk và /proc/uptime, rồi thoát. Yêu cầu duy nhất là host từ xa có python3; thiếu nó thì thanh thống kê để trống.
Có. Từ bản 1.0.21, mỗi host đã lưu có trường Jump Host / Bastion (nối nhiều host bằng dấu phẩy) và tùy chọn Chuyển tiếp SSH agent. Import ~/.ssh/config vẫn bỏ qua dòng ProxyJump, nên hãy tự đặt jump host cho host đã import. Gõ alias ssh có sẵn vào một shell pane thường cũng chạy như trong Terminal.app, nhưng không có nhóm hay thống kê server của host đó từ luồng Connect được quản lý.
Importer đọc các dòng Host, HostName, User, Port và IdentityFile, và tạo một host đã lưu cho mỗi mục Host có HostName. Các khối wildcard Host * và mục không có HostName bị bỏ qua, và chỉ IdentityFile đầu tiên được giữ. Nó không parse ProxyJump, khối Match hay các directive nâng cao khác. Những thứ đó vẫn có hiệu lực nếu bạn gõ alias trực tiếp trong shell pane.