在 Mac 上管理 50 多台 SSH 服务器和云主机

Mac SSH 服务器管理,哪怕要管 50 台以上的 SSH 服务器和云主机,也可以这样做:给主机分组,密码存进系统 Keychain,不在每台机器上装 Agent 也能看到实时的 CPU、内存和磁盘数据。MXterm Pro 的 SSH Host Manager 就是这么做的,走的是真正的 OpenSSH 连接。Free 默认保存 5 台主机,Pro 没有这个上限。
这篇指南适合谁
这篇指南写给在 AWS、Google Cloud、DigitalOcean、Hetzner 或裸金属上跑后端基础设施的人。主机多到脑子记不下,分散在生产、预发布和几台临时开发机上。
如果只管一两台服务器,普通的 Terminal.app 标签页加 ~/.ssh/config 仍然是最简单的工具。分组、筛选、广播和遥测这些整理功能,要等你同时处理十几台以上主机、分不清哪个标签页是哪台时,才真正用得上。
给几十台主机分组和筛选
按 ⌘⇧H 打开 SSH Host Manager。每台主机要填名称、地址、端口、用户名,并选三种认证方式之一:密码、私钥文件或 keyboard-interactive。大多数快捷键(包括这个)都能在“设置 → 快捷键”里改键位;缩放、⌘, 和 ⌘1 到 ⌘9 等少数几个是固定的。
每台主机属于一个分组。内置六个分组(Production、Staging、Testing、Cloud / VPS、Internal / VPN、Development),也可以自己加。主机列表上方有一排筛选标签,每个分组旁边显示实时数量。
点“Production (14)”,50 台主机的列表就收窄到敲错一个字就可能出事的那几台。这是一组平铺的分组筛选,不是嵌套的文件夹树。除了这些筛选,没有单独的文本搜索框,别指望更深的功能。
如果服务器记在 ~/.ssh/config 里,点导入按钮,它会读取 Host、HostName、User、Port 和 IdentityFile 行,一次性归到“Imported”分组。同一个按钮还能导入 MobaXterm 会话文件(只导入 SSH 会话,归到“MobaXterm”分组)和 iTerm2 配置文件导出(只导入命令是纯 ssh 行的配置,归到“iTerm2”分组)。在 Mac 上,会话管理器的导入 / 导出标签页还能扫描 iTerm2 配置文件。
导入的主机会在每一行显示分组名(MobaXterm 或 iTerm2)作为徽标,但筛选行只列六个默认分组和你自己加的分组,想按它筛选就新建一个同名分组。在 Pro 上,50 台主机的配置一次导入就行,不用填 50 遍表单。在 Free 上,导入到 5 台上限就停。
导入器不解析 ProxyJump 和其他高级指令,下面会细说。
密码和密钥到底存在哪里
SSH 密码保存到操作系统的凭据库(Mac 上是 macOS Keychain),服务名是 com.mxterm.desktop.ssh,以主机 id 为键。密钥口令不会保存:应用在写入主机列表之前就把它去掉,它也不会进入系统凭据库。Windows 凭据管理器已接入,但 Windows 上的 SSH 尚未验证。
MXterm Pro 自己的本地设置文件里不写任何机密。旧版本里还留着明文密码的已保存主机,会在下次加载时重写成不含密码的版本。
~/.ssh/id_ed25519 这样的密钥文件路径不是机密,只是个路径,所以只有这一项仍留在普通的主机列表里。这和你在 ~/.ssh/config 里看到的一致。
为什么重新连同一台服务器几乎是瞬间
在 macOS 上,MXterm Pro 打开的每个 SSH 连接都带三个选项:ControlMaster=auto、ControlPath=~/.mxterm/sockets/%r@%h:%p 和 ControlPersist=10m。这是真正的 OpenSSH 连接复用,不是自己另搞的一套。
第一次连接某台主机时会建立一个主 socket。之后连同一台主机的连接(比如第二个终端标签页或 SFTP 面板)都复用它,最后一个连接关闭后,主连接还会保留 10 分钟。这样省掉了新的 TCP 握手和认证往返。修改已保存主机的连接设置或删除主机,会关闭它的共享连接;服务器拒绝登录或要求新密码时,文件面板会出现重置连接按钮。
这也解决了密码认证主机的一个问题。BatchMode=yes 意味着 SFTP 不能自己提示输入密码,所以没有共享的主 socket 时,密码主机在终端标签页里能连上,在文件浏览器里却会失败。共用 ControlPath 后,SFTP 面板就能搭上你已在终端分屏里认证过的会话。
同时在多台服务器上执行同一条命令(Broadcast Mode)
⌘⇧B 开启 Broadcast Mode,当前标签页的所有分屏已经在广播组里。按住 Option/Alt 点击某个分屏,可把它移出或加回。清空按钮会清空整个组,全选按钮会把它重新填满。屏幕上会一直显示“Broadcast ON · N panes”横幅。在组内任一分屏输入的按键,会按布局顺序发给组内所有分屏。
靠它管 50 台服务器之前,先确认两件事。广播组一开始就是当前标签页的所有分屏,所以输入前先缩小范围;它只覆盖这个标签页的分屏,不是所有已打开的连接。而且开启后不会对每次按键逐一确认,因为它的用意就是输入一次、处处生效。
兜底的办法是那条横幅,很难忽略。清空会撤掉整个组,按 Esc 立即退出。建组时要像对生产服务器群跑 pssh 或 tmux 同步分屏之前那样小心,因为工具不会拦着你把命令广播给错误的六台服务器。
不装监控 Agent 也能看服务器实时状态
Server Telemetry HUD 位于 SSH 标签页底部,显示 CPU %、内存 %、磁盘 % 和运行时间,按绿、琥珀、红三色标示,超过 65% 变琥珀色,超过 85% 变红色。每 20 秒自动刷新,也可以点手动刷新按钮立刻拿到当前数值。
每次刷新都通过你已有的 SSH 连接运行一条一次性的 python3 -c "..." 单行命令:用 os.getloadavg() 对照核心数读 CPU 负载,从 /proc/meminfo 读内存,用 shutil.disk_usage('/') 读磁盘,从 /proc/uptime 读运行时间,然后退出。服务器上什么都不安装,也没有任何进程常驻。
唯一的要求是远程主机上有 python3。很多服务器镜像自带,但 Alpine 这类精简镜像往往没有。没有它,状态栏就是空的:它同时尝试的 uptime 调用拿不到可用字段,MXterm Pro 宁可不显示数字,也不编造。内存读自 /proc/meminfo,所以 macOS 或 BSD 服务器的内存处显示横线而不是百分比。
跳板机和堡垒机怎么办
已保存的主机有一个跳板机 / Bastion 字段(可以用逗号分隔,串联多个),还有一个转发 SSH Agent 选项。连接按真正的 ssh 参数构建,相应设置 -J 和 -A。
~/.ssh/config 导入器不会帮你填这个字段。它只读取 HostName、User、Port 和 IdentityFile,ProxyJump 行直接跳过而不转换。命令是 ssh -J bastion host 的 iTerm2 配置文件,则会连跳板机一起带过来。对从 ~/.ssh/config 或 MobaXterm 导入的主机,请自己在主机表单里设置一次跳板机。
另外,终端分屏是真正的 PTY。如果 ~/.ssh/config 里有一条 Host prod-db,并带 ProxyJump bastion 行,在普通 shell 分屏里输入 ssh prod-db,就会像 Terminal.app 一样遵循这份配置。
不过这样得不到该主机的分组标签和服务器状态栏。
广播只覆盖一个标签页里的分屏。从 SSH Host Manager 打开的标签页只绑定一台主机,所以想同时往多台服务器输入,就在一个标签页里开几个普通 shell 分屏,各自运行 ssh <alias>,再对它们广播。Free 没有分屏数量限制。
Free 与 Pro:管 50 台服务器的实际代价
这个场景最关键的数字是:免费版最多保存 5 台 SSH 主机。分组、导入、连接复用、广播和遥测在 Free 和 Pro 上完全一样,只是不升级到 Pro,就存不了 50 台主机,Pro 的主机数没有上限。
应用里别的地方也是同一条 Free 与 Pro 的分界线。Free 没有分屏数量限制;Control Room(原 War Room)每个房间最多 2 个成员(Pro 没有成员上限);还能保存 1 个 MXterm Host。
管 50 台服务器用不到这些。只有你同时对这些服务器跑 Claude Code、Codex 或 Gemini CLI,和 SSH 会话并行时才会碰到。
和 iTerm2、Warp、Termius、MobaXterm 比,管服务器群怎么样
iTerm2 是成熟的免费终端模拟器,仅限 macOS,tmux 集成出色,配置文件管理也很好。配置文件加上基于 Keychain 的密码管理器已经覆盖不少场景,但它没有专门的 SSH 主机管理器,不带分组筛选,也没有遥测 HUD。这些得靠 tmux、dotfiles 和另外的监控工具自己拼。
Warp 是把 AI 放进 shell 同一个窗口的现代终端。如果你想让 AI 帮写命令、跑 Agent,它是个不错的选择。但它不是围绕几十台带分组和服务器状态的已保存 SSH 主机来设计的。MXterm Pro 则是为在分屏里同时跑多个 Agent 而做。
Termius 是这里最接近的对手。跨设备的 SSH 主机同步、手机 App 和成熟的主机整理功能都是实打实的优势,如果你需要在手机上看主机列表,它更合适。它不能并排运行多个 AI 编程 Agent,也不会为每个 Agent 创建一个 git worktree。
MobaXterm 仍然是需要在 SSH 之外使用 X11 转发和隧道的 Windows 用户手里最完整的工具,但它没有 macOS 版本,也没有 AI Agent 编排。
MXterm Pro 的 Multi-Agent Control Room 在分屏里同时运行多个 Agent(Claude Code、Codex、Gemini CLI 等)。开启 worktree 隔离后,每个 Agent 分屏都有自己的 git worktree,位于 <repo>/.worktrees/<slug>,这有助于降低一个 Agent 的失误波及另一个 Agent 工作副本的可能性。
⌘J Command Recipes 会把你输入的内容和一套内置的现成 Linux 命令做匹配。这是关键词匹配,不是模型在写 bash。
开始使用
下载 MXterm Pro,用你现有的主机试试 SSH Host Manager。分组、导入、连接复用、广播和遥测 HUD 在免费版上都能用。
管真正的 50 台服务器时会撞上的一堵墙,是 5 台已保存主机的上限。Pro 的无限主机能让你越过它。
多分屏 SSH、Command Recipes(Cmd+J)和多 Agent 的 Control Room (原 War Room):先免费用。
常见问题
已保存的 SSH 密码存进操作系统凭据库(Mac 上是 macOS Keychain),服务名是 com.mxterm.desktop.ssh,不写进应用的设置文件。密钥口令不保存。密钥文件路径(~/.ssh/id_ed25519)不是机密,所以留在主机列表里。与终端分屏不同,文件面板、传输和状态栏使用 BatchMode=yes,无法提示输入密码。
可以。⌘⇧B 开启后,当前标签页的所有分屏都在组内。Option/Alt+点击切换某个分屏,清空按钮清空整个组,全选按钮重新填满。“Broadcast ON · N panes”横幅一直可见,按 Esc 立即退出。没有对每次按键的确认,所以先缩小广播组。它的保护机制是一条很难忽略、也很容易清除的横幅,而不是确认弹窗。
不能。免费版最多保存 5 台 SSH 主机,Pro 去掉这个上限。分组、筛选、导入、连接复用、广播和遥测 HUD 在两个版本上表现一致。50 台服务器的规模会先撞上主机数量的限制。
不需要常驻 Agent。每次刷新通过你现有的 SSH 连接运行一条一次性的 python3 单行命令,读取 CPU 负载、/proc/meminfo、磁盘用量和 /proc/uptime,然后退出。唯一的要求是远程主机上有 python3,没有的话状态栏是空的。
可以。从 1.0.21 起,每台已保存主机都有跳板机 / Bastion 字段(用逗号串联多个)和转发 SSH Agent 选项。导入 ~/.ssh/config 仍会跳过 ProxyJump 行,所以导入的主机要自己设置跳板机。在普通 shell 分屏里输入你现有的 ssh 别名也行,和 Terminal.app 一样,只是没有该主机的分组,也没有从 SSH Host Manager 点连接时才有的服务器状态栏。
导入器读取 Host、HostName、User、Port 和 IdentityFile 行,每个带 HostName 的 Host 条目生成一台已保存主机。通配的 Host * 块和没有 HostName 的条目会跳过,IdentityFile 只保留第一个。它不解析 ProxyJump、Match 块和其他高级指令。如果直接在 shell 分屏里输入别名,这些指令仍然生效。