在日常折腾虚拟机的时候,很多人都会遇到同一个痛处:明明 MacBook 摆在面前,却要在 VMware 虚拟机窗口里点来点去,复制粘贴还经常因为快捷键差异按错。尤其在装了不少开发环境之后,直接在虚拟机图形界面里操作就更别扭了。我后来的做法,是把虚拟机当成一台远程服务器来用——在 Mac 上用 SSH 工具 electerm 连进 VMware 虚拟机,所有命令都在一个标签页里搞定。electerm 是一个跨平台的 SSH 客户端,界面干净,支持标签页、密钥管理、SFTP 文件传输和端口转发,用来替代系统自带的命令行工具,体验能舒服不少。这篇内容不只是告诉你填几个参数然后点连接,而是把虚拟机网络、SSH 服务、认证方式、常见故障这些环节串起来,适合所有想在 MacBook 上更顺畅地管理虚拟机的朋友。
1. 为什么我不直接在虚拟机窗口里操作,而要用 SSH 连进去
1.1 从图形界面到命令行的工作习惯转变
一开始我用 VMware 虚拟机,也是老老实实打开图形界面,鼠标点开终端,然后一条条敲命令。用久了才发现几个非常头疼的地方。
第一个是快捷键的错位。Mac 的Command键和 Linux 桌面里的Ctrl键位置不同,导致我编辑配置文件的时候,复制、粘贴、全选经常按成没有反应,过一会儿才意识到自己按的是 Mac 上的习惯键。第二个是宿主机和虚拟机之间的文件交换。虽然装了 VMware Tools 可以拖拽文件,但版本不匹配或者系统更新之后,拖拽时不生效的情况并不少见,最后还是要走共享目录或者用 U 盘一样的思路,绕来绕去很麻烦。第三个是没有办法多开。我一旦在虚拟机里做测试,就想同时再开一个窗口看 Mac 本机的日志,但虚拟机窗口总是抢占焦点,来回切换非常消耗注意力。
后来我把 SSH 用起来,这些问题基本一次性解决了。SSH 连上之后,虚拟机图形界面可以完全不开,甚至让它无头运行,只在后台提供 SSH 服务。我在 Mac 上打开 electerm,一个窗口里可以同时挂好几台虚拟机,每台是一个标签页,切来切去就像切换浏览器里的页面一样方便。这种工作方式也更接近真实服务器的操作习惯——生产环境里没有显示器给你看,一切操作都通过 SSH 完成。
1.2 electerm 有什么值得用的地方
macOS 自带的 Terminal 也能敲 SSH 命令,但如果你要做的事比较多,就会发现它其实并不算一个“趁手的 SSH 管理工具”。每次连接都要手动输入ssh user@ip,带密钥的时候还要写完整路径,连机器一多,既不直观也容易记错。iTerm2 本身是个很好的终端,但会话管理、密钥保存、SFTP 面板这些能力它并不会主动给你,还得配合脚本或者额外工具。
electerm 在这类工具里算是比较轻量又全面的一款。它最常见的打开方式是这样:新建一个连接,填好 IP、端口、用户名,保存,下次双击就能进入。每次连接记录放在左侧列表里,鼠标一点就能连上。它内置的 SFTP 面板尤其实用,连上虚拟机之后直接看到文件系统,拖拽就能传文件,省去单独开 FileZilla 或者 scp 的记忆负担。另外它还支持分组管理、标签页、分屏和端口转发,这些特性正好覆盖了我日常和虚拟机打交道的大部分场景。
2. VMware 网络模式选择:NAT、桥接、仅主机该怎么选
2.1 三种网络模式的区别
在用 electerm 之前,我一直强调先把 VMware 的网络模式搞清楚,因为很多连不上虚拟机的问题,根源不是 SSH 工具,而是虚拟机根本不在你预期的网络里。VMware 的虚拟机网络模式一般有三种:NAT、桥接(Bridged)、仅主机(Host-only)。它们的核心区别,就是虚拟机拿到的 IP 属于哪一段,以及谁能访问到它。
我把三种模式的特点整理成了下面这个表格:
| 网络模式 | 虚拟机 IP 来源 | 宿主机能否访问 | 虚拟机能否访问宿主机 | 外部设备能否访问虚拟机 |
|---|---|---|---|---|
| NAT | VMware 内置网段,通常是 192.168.x.x | 能,通过 VMware 虚拟网卡 | 能,走 NAT 网关 | 一般不能直接访问 |
| 桥接 | 和宿主机同一局域网,由路由器 DHCP 分配 | 能 | 能 | 能 |
| 仅主机 | VMware 独立虚拟网段 | 能 | 能,但通常不能访问外网 | 不能 |
在这个表里,最容易理解的是桥接模式:虚拟机相当于和 MacBook 并列站在同一台路由器下面,大家属于同一个局域网,别的设备也能看到它。NAT 模式更类似家庭路由器模式——虚拟机被 VMware 的虚拟网卡挡在后面,对外只有一个 NAT 地址,外面看不着它,但虚拟机通过 NAT 网关还是可以上网。
2.2 针对 MacBook 宿主机的推荐配置
如果你只是个人开发、本地调试,我最推荐的其实是 NAT 模式。原因是它不会占用整个局域网里真正的 IP 地址,也基本不用去碰路由器的设置,只要 VMware 虚拟网卡工作正常,Mac 和虚拟机之间就能互相访问。这样做也不容易引发公司网络或者家庭网络中的地址冲突,属于最稳妥的默认选项。
在 MacBook 上使用 VMware Fusion 时,打开虚拟机的设置,在网络适配器那里选择 NAT 就可以了。启动虚拟机后,在虚拟机内部执行ip addr查看 IP 地址,通常能看到一个以192.168.x.x开头的地址。需要注意,NAT 模式下这个 IP 可能会在虚拟机重启之后发生变化,所以如果你不希望每次都重新查地址,最后一步要做静态 IP 或者 DHCP 保留,这个我在后面“固定虚拟机 IP”的部分会详细讲。
有几次我看到身边的朋友连不上虚拟机,查下来发现是 VMware 的虚拟网卡 IP 段已经被其他软件改过了。比如系统里曾经装过老版本的 VMware,升级后留下了多个虚拟网卡记录,导致宿主机认为自己在192.168.56.x网段,而虚拟机拿到的 IP 却在192.168.110.x网段。这种问题不打开网络设置去对比一下,很难一眼发现。
3. 虚拟机侧 SSH 服务的开启与检查(以 Ubuntu 为例)
3.1 安装并启动 sshd
SSH 连接能不能成功,前提是虚拟机里有一个正在监听的 SSH 服务端。大多数 Ubuntu 默认最小安装是不会自带openssh-server的,所以你会发现第一次连接时,工具弹出来的不是密码输入框,而是Connection refused。这就是因为 22 端口根本没人监听。
安装和启动的命令其实非常简单:
sudo apt update sudo apt install -y openssh-server sudo systemctl enable ssh sudo systemctl start ssh systemctl status ssh看到状态里显示active (running),说明服务端已经起来了。这里我习惯多验证一步,在虚拟机本地执行ssh localhost,如果本机能连上,就说明 sshd 没有问题,后面连不上的原因就可以优先往网络和防火墙那边排查。
如果你用的是 CentOS 或者 Fedora,安装命令不大一样:
sudo yum install -y openssh-server sudo systemctl enable sshd sudo systemctl start sshd另外,Windows 虚拟机也可以走这条路。Windows 10/11 的“可选功能”里自带 OpenSSH Server,装上并启动服务后,同样可以用 electerm 连接。只是 Windows 的防火墙默认会拦截入站连接,需要在防火墙设置里放行 22 端口,否则外面再怎么测都是超时。
3.2 查看 IP 地址的几种方式
知道虚拟机的 IP 地址,才算真正拿到了连接入口。在虚拟机里查 IP,我常用的命令有两个:
ip addr show hostname -Ihostname -I是查看 IP 最快的方式,它会紧凑地列出当前所有网卡的 IPv4 地址。如果你接到的是云虚拟机,可能看到两个地址,一个是公网地址,一个是内网地址;在 VMware 本地虚拟机里,一般只需要关注以192.168.x.x或者172.16.x.x开头的那个。
如果你发现ip命令不存在,可以先安装一下基础网络工具:
sudo apt install -y net-tools ifconfig拿到 IP 之后,建议顺手写在某个笔记里。因为 NAT 模式的 IP 可能在重启后变化,第一次连接时多记一下,能减少后续反复查地址的次数。等到我后面介绍完固定 IP 的方法,这个临时记录的 IP 就可以退休了。
4. electerm 连接虚拟机的完整步骤
4.1 下载安装与界面认识
在 MacBook 上安装 electerm 有两种常见方式。第一种是直接下载官网或 GitHub Releases 页面的 macOS 安装包,把应用拖到“应用程序”文件夹;第二种是如果你已经比较熟悉 Homebrew,可以用一行命令搞定:
brew install --cask electerm第一次打开 electerm,它会提示你设置一个本地密码库。我强烈建议创建这个密码库,不要跳过。因为后续保存的密码、私钥信息都会放在这里,如果完全不加密,等于把虚拟机登录凭证明文放在本地磁盘里。设置好密码后,主界面分三个核心区域:左侧是会话列表和分组,中间是终端区域,右侧默认有一个 SFTP 面板,可以在菜单里控制显示或隐藏。
4.2 新建连接的参数填写
点击左上角的“新建连接”,弹出的窗口需要填几个关键参数:连接名称、IP 地址、端口、用户名和认证方式。名称只是给你自己看的,建议起成一眼能认出来的名字,比如“Ubuntu-Web-VM”。端口默认填 22,如果你在虚拟机里修改过 SSH 端口,记得同步修改。认证方式先选密码,跑通后再换成更安全的密钥认证。
假设我有一台虚拟机的 IP 是192.168.56.101,用户名是user,基础配置就如下面表格这样:
| 配置项 | 推荐值 |
|---|---|
| 连接名称 | Ubuntu VM |
| IP 地址 | 192.168.56.101 |
| 端口 | 22 |
| 用户名 | user |
| 认证方式 | 密码 |
填完后点保存,左侧会话列表里就会出现这个连接。双击它,electerm 会弹出第一次连接时的指纹确认提示,询问你是否信任远程主机的 host key。这一步不是走形式,建议在虚拟机里执行ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub,看看指纹是否和弹窗里的指纹一致。确认无误再点信任,可以避免中间人攻击,也能防止自己稀里糊涂连到一台重装过的错误机器上。
4.3 第一次连接:密码登录与 host key 确认
确认指纹后,electerm 会要求输入用户密码。输入正确后,终端里就会出现 Linux 的命令行提示符,这时你已经进入了虚拟机的命令行环境,可以执行安装软件、修改配置、跑脚本等一切操作。从这一步开始,VMware 窗口里的图形界面就只是一个“备胎”了。
第一次登录成功之后,我建议顺手做两件事。第一,更新一下虚拟机的包列表,确保后续安装软件不出幺蛾子。第二,检查一下 SSH 默认配置,关闭 root 用户的密码登录。虽然本地虚拟机风险不高,但一旦后面开启了端口转发或者换成了桥接模式,这些安全习惯会帮你挡住很多麻烦。
4.4 配置免密登录:密钥对方式
密码登录固然省事,但每次都敲密码还是有些繁琐,而且密码很容易写在便利贴上、记在聊天框里。我更推荐用密钥对的方式实现免密登录。整个过程分三步:
第一步,在 MacBook 上生成密钥对。如果还没有现成的虚拟机专用密钥,可以执行:
ssh-keygen -t ed25519 -C "macbook-vm-key"生成过程中可以指定私钥保存路径,比如~/.ssh/vms/ubuntu-vm,也可以直接回车使用默认路径。第二步,把公钥传到虚拟机的~/.ssh/authorized_keys文件里。最简单的方式是使用ssh-copy-id:
ssh-copy-id -p 22 user@192.168.56.101如果你刚用密码登录过一次,这一步会把你的公钥自动追加到虚拟机的配置文件里。第三步,回到 electerm 的连接设置,把“认证方式”改成“密钥”,选择刚才生成的私钥路径。保存后再双击连接,你会发现不再需要输入密码,直接就能进入系统。
免密配置不生效,最常见的原因是权限设置不对。OpenSSH 对~/.ssh目录和authorized_keys文件的权限非常敏感,目录必须是 700,文件必须是 600。可以这样修正:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys4.5 用 SSH 会话解决文件传输:SFTP 用法
electerm 的右侧 SFTP 面板,是它区别于普通终端的一个亮点。只要 SSH 连接正常,面板就会自动加载虚拟机里的文件目录,你可以直接用鼠标把本地文件拖进去,也可以把虚拟机里的日志或数据包拖回到 Mac 本地。这个功能走的就是 SSH 通道,不需要额外配置 VMware Tools,也不需要挂载共享目录。
我平时用这个面板来传补丁包、配置文件、上传压缩包,效率很高。但如果遇到传输多个小文件或者要做增量备份,我还是会切回命令行,用scp和rsync更可控。一个小提醒:如果虚拟机改过 SSH 端口,SFTP 面板里的端口参数也要同步改掉,否则数据连接会失败。这个坑我踩过,症状是终端能连上,文件传输却一直转圈。
4.6 管理多台虚拟机的会话技巧
如果你像我一样,MacBook 上同时跑着 Ubuntu 开发机、CentOS 测试机,甚至还有一台 Windows 虚拟机,建议给每台机器单独建一个会话,并且用分组来归档。electerm 支持把会话拖进不同的文件夹,比如“开发环境”“测试环境”“临时调试”。这种组织方式比记 IP 地址高效多了,因为只要会话命名清晰,鼠标一点就能进入对应系统。
标签页功能也很顺手。不同虚拟机的会话可以用多个标签页平铺在同一个窗口里,再配合分屏功能,我在左边盯着 CentOS 的日志,右边在 Ubuntu 上敲命令,整个过程不需要切换窗口焦点,体感接近一个轻量级跳板工具。
5. 连接失败的排查方法与心得
5.1 检查清单:从 IP 通不通到端口通不通
SSH 连不上,不管用什么工具,排查逻辑都是一样的。最忌讳的是东点一下西点一下,最后把自己搞乱。我习惯按顺序走下面这套检查单。
第一步,确认宿主机到虚机的基本网络连通性。在 Mac 终端里执行:
ping 192.168.56.101如果 ping 不通,说明网络层就有问题,接下来所有关于 SSH 的检查都还排不上号。先回到 VMware 看虚拟机是否在运行,虚拟网卡是否正常。第二步,检查端口是否开放:
nc -vz 192.168.56.101 22如果这条命令返回Connection refused,说明 SSH 服务没有在端口上监听;如果超时,则大概率是防火墙丢包。第三步,回到虚拟机里执行systemctl status ssh,确认 sshd 确实在运行。第四步,检查防火墙规则,Ubuntu 下可以这样看:
sudo ufw status如果 ufw 显示Status: active,并且 22 端口不在放行列表里,那就直接执行sudo ufw allow OpenSSH放行。
5.2 常见坑:VMware 网络服务、虚拟机休眠、host key 变更
这类问题排查次数多了,我发现大家踩得最深的坑有几个。第一个是 VMware 自身的 DHCP 服务没有正常启动。有时候虚拟机开机后根本拿不到 IP 地址,你在虚拟机里执行ip addr看不到正常 IP,那自然没法连接。这种情况下,需要检查 VMware 的虚拟网络设置,或者手动给虚拟机配置静态 IP,绕过 DHCP。
第二个容易被忽略的坑是虚拟机休眠。它从挂起状态恢复到运行状态后,网络服务可能需要一点时间重新初始化。如果你发现刚恢复时连不上,别急着反复重连,给它十几秒,再用ping测试一下通不通,往往就恢复了。
第三个坑是 host key 变更。当你重装虚拟机系统,或者把虚拟机磁盘从一个模板复制过来时,SSH 的 host key 会变化。electerm 连接时会提示 host key 不匹配,甚至直接拒绝连接。解决办法不是绕过它,而是到会话设置里清理掉旧的 host key 记录,重新信任一次新指纹。命令行模式下对应的是清理~/.ssh/known_hosts里的旧 IP。
5.3 防火墙配置:ufw 和 firewalld 的具体命令
在 Ubuntu 上,我很少直接关闭防火墙图省事,而是把需要的端口精确放行:
sudo ufw allow OpenSSH sudo ufw enable sudo ufw status在 CentOS 或者 Fedora 上,如果使用 firewalld,则常用下面几条:
sudo systemctl enable firewalld sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reload这里特别想提醒一句:网上很多教程会建议你把防火墙直接关掉,“反正本地虚拟机嘛”。但一旦你之后在虚拟机上跑 MySQL、Nginx,或者不小心把端口转发对外开放了,关闭防火墙的代价就会变得很大。只放行需要的端口,多花一分钟敲命令,后面能少很多意外。
5.4 用日志找到真正原因的案例
除了上面这些常规检查,SSH 还有一个非常有用的日志入口。在 Ubuntu 上执行:
sudo tail -f /var/log/auth.log我遇到过一种情况,IP 通、端口通、密码也对,但 electerm 就是反复提示认证失败。后来通过日志发现里面有一行User from 192.168.56.1 not allowed because not listed in AllowUsers,我才想起来之前在某次安全加固时,在sshd_config里加了AllowUsers列表,后来用户名大小写改了,配置没同步。看到日志之后,一分钟就解决了。CentOS 上对应的日志位置是/var/log/secure。这个排查思路适用于所有 SSH 场景,值得每次连不上时先翻一翻。
6. 让连接更顺手的进阶技巧
6.1 固定虚拟机 IP:DHCP 保留或静态 IP
前面几次提到 NAT 模式下 IP 不固定,如果你希望以后每次打开 electerm 都能用同一个地址连接,建议在虚拟机里配置静态 IP。以 Ubuntu 24.04 为例,编辑/etc/netplan/01-network-config.yaml,把网卡的地址设为固定值:
network: version: 2 ethernets: ens160: dhcp4: no addresses: - 192.168.56.101/24 routes: - to: default via: 192.168.56.2 nameservers: addresses: - 192.168.56.2 - 223.5.5.5保存后执行sudo netplan apply生效。这里要注意,网关地址要填 VMware NAT 模式对应的虚拟网关 IP,每个网络环境下可能不一样,最好先通过ip route show或者 VMware 网络设置确认一下。如果不想手写 Netplan,还可以在 VMware 的 DHCP 配置里做 MAC 地址和 IP 的绑定,但那相当于还是依赖 DHCP 服务,不如静态 IP 稳定。
6.2 用 electerm 的端口转发访问虚拟机的 Web 服务
开发联调时,我经常需要在虚拟机里起一个 Web 服务,然后用 Mac 的浏览器去访问。虽然直接用虚拟机 IP 加端口也不是不行,但用端口转发更优雅,也更接近线上调试环境。electerm 的会话设置里可以添加转发规则,比如把 Mac 本地的8080端口转发到虚拟机的80端口,这样在浏览器里访问http://localhost:8080就能直达虚拟机上的站点。
命令行里的等价操作是:
ssh -L 8080:localhost:80 user@192.168.56.101两种方式我都用过。临时调试我就直接用命令行加参数,需要把规则长期保存下来的时候,就把它写进 electerm 的会话配置里,下次连接自动生效。
6.3 使用分组、搜索和快捷键管理多台机器
虚拟机多了以后,会话列表里会越来越长。electerm 左侧的搜索框能帮你按名称快速过滤,分组功能也可以把“开发”“测试”“临时”区分开。常用快捷键方面,Cmd+L能快速聚焦会话列表,Cmd+T新建标签页,Cmd+\进行分屏。这些功能组合起来,切换多台虚拟机可以变得非常流畅。我还习惯给不同环境配不同颜色主题,比如开发环境用绿色,测试环境用橙色,这样从视觉上就能避免混淆。
最后再分享一个小细节:如果你和我一样在 MacBook 上同时连接几台虚拟机,建议把虚拟机专用的 SSH 密钥单独放在一个目录下,比如~/.ssh/vms/,不要和日常开发用的 GitHub 密钥混在一起。这样即使某台虚拟机需要轮换密钥,也不会影响其他用途。这套连接流程看上去零零碎碎,但一旦跑顺了,你会慢慢忘记虚拟机窗口里那个卡顿的图形界面,更像是在用一台真正的远程服务器。作为日常开发的一部分,SSH 工具和虚拟机搭配得当,能让你把精力放在代码和问题上,而不是跟窗口较劲。