折腾过虚拟机的人基本都经历过这样一个场景:装好了系统,打开虚拟机窗口,用鼠标在里面点来点去,想复制一段命令却发现剪贴板不通,窗口分辨率还很别扭,等你想同时操作好几台机器的时候,更是一片混乱。后来我发现,用SSH远程连接工具连上VM虚拟机,才是真正舒服的玩法。今天这篇就专门说说这件事——为什么要这么做、怎么把前置条件配好、工具怎么选、以及第一次连接时最容易卡住的地方。
这篇内容是给两类人看的:一类是刚接触Linux虚拟机、还在忍受VM控制台窗口的同学;另一类是已经在用SSH,但偶尔遇到连接失败、想系统理清网络和配置逻辑的开发者。我会把从我实际踩坑里总结出来的经验都摆出来,尽量讲得直白,跟着操作就能跑通。
1. 为什么绕不开SSH:虚拟机控制台窗口远没有你想的那么方便
很多人一开始觉得,我明明能直接打开虚拟机的图形界面,为什么非要用SSH从外部连进去?这不脱裤子放屁吗?我当初也这么想。真正用过一阵子之后才明白,控制台窗口和SSH的体验差距,简直是天壤之别。
1.1 VM控制台窗口的三大痛点
先说复制粘贴。在虚拟机窗口里,宿主机和虚拟机之间的剪贴板经常处于“时灵时不灵”的状态。你要从网页上复制一条命令,切到虚拟机窗口里粘贴,有时候能用,换了发行版或者没装增强工具(比如VMware Tools或VBox Guest Additions)之后,直接不互通。结果就是对着屏幕手敲一长串命令,或者花十分钟去装工具。SSH连上之后,宿主机和远程会话之间复制粘贴天然就是通的,因为是走网络协议的,和剪贴板无关。
再说显示效果。虚拟机的图形界面分辨率经常很尴尬,要么拉伸变形,要么只有800x600,你想把它调大,又受到虚拟机显卡驱动的限制。SSH就不存在这个问题——纯文本终端,窗口多大,会话就多大,支持自由缩放,字号也能任意调整,看着舒服多了。
第三个痛点是多机器管理。如果你同时开两三台虚拟机做集群实验,控制台窗口来回切换能把人搞疯。窗口一多,哪台是哪台都要靠标题栏分辨。用SSH工具之后,所有会话列在侧边栏,一目了然,还能给每台机器起一个中文备注名,点一下就是一个终端,效率完全不一样。
1.2 SSH到底是什么:一条加密的远程命令通道
SSH全称是Secure Shell,它的本质是一条加密的远程命令通道。你在一台机器上运行SSH客户端,去连另一台机器上运行的SSH服务端,中间传输的所有数据都是加密的。登录时用密码或者密钥验证身份,登录成功后,你敲的每条命令都发到远程机器执行,结果传回本地终端。
这套机制的好处,用一个不太严谨但很贴切的比喻:虚拟机窗口相当于你跑到机房,坐在那台电脑前面用键盘;SSH相当于你坐在自己工位上,用一条加密专线远程操作机房的机器。后者不需要你在物理机旁边,不需要依赖图形界面,也不怕通信内容被人偷听。
2. 连接前的必修课:把虚拟机的“门牌号”搞清楚
在用SSH工具连接之前,你得先知道远端的门牌号,也就是虚拟机的IP地址。这一步看着简单,实际最容易出问题。我在帮别人排查的时候,十次里有三四次是卡在IP地址根本没搞对。
2.1 桥接和NAT:两种网络模式决定你能不能连上
VMware VirtualBox这些虚拟机软件,新建虚拟机的时候会让人选网络模式,最常见的就是NAT和桥接两种。它们直接影响宿主机能不能访问虚拟机的IP,所以必须先弄清楚差别。
NAT模式,虚拟机和宿主机在一个内部小网段里,虚拟机通过宿主机转发访问外部网络。用电话分机的逻辑来理解就很形象:所有虚拟机都是分机,宿主机是总机,分机之间能互拨,分机也能拨外线,但外部的人想直接拨到分机是进不来的。也就是说,默认NAT模式下,从宿主机往虚拟机发SSH连接,方向是不通的。
桥接模式,虚拟机和宿主机像两台并排的电脑,都接在同一个交换机上,各自从路由器拿到独立IP。对外来说,虚拟机像真实局域网里的一台机器,宿主机访问它,跟访问局域网里另一台电脑没有任何区别,SSH自然能通。
所以如果你发现怎么连都连不上,先回头确认一下虚拟机的网络模式。使用桥接模式,或者把NAT模式的虚拟网络配置成允许宿主机访问(VMware里可以直接加一条端口转发规则),都是可行方案。从新手友好程度来看,桥接模式最省心,但也依赖你所在局域网比较干净、路由器不限制设备数量。
2.2 在虚拟机里面查IP的两个命令
知道了模式,接下来要去虚拟机里面看它实际拿到的IP。打开虚拟机的终端,执行:
ip addr重点看网卡对应的IP地址。如果主机名下方有一个192.168.x.x或10.0.x.x之类的地址,这个就是要拿来连接的门牌号。有些系统默认没有启用网卡,会看到state DOWN,这时先执行:
sudo nmcli connection up 网卡名或者直接用ip link set 网卡名 up把网卡拉起来。
另外还有一个非常使用的工具:
hostname -I它能直接在屏幕输出当前所有IP地址,省得在一堆输出里找半天。如果你是先在虚拟机里查好IP,再回到宿主机上用SSH工具连接,整个过程就很顺。我习惯在查IP前先确认虚拟机是开机状态,并且系统完整启动完成,不然容易白等。
2.3 动态IP的坑:今天能连上,明天为什么不行了
默认情况下,虚拟机通过DHCP自动获取IP,这意味着每次重启可能会变。你今天记住了这个IP,明天虚拟机重启之后可能就变了,SSH工具里填的还是旧地址,当然连不上。
解决这个问题有两条路。简单粗暴的,是每次重启后用hostname -I查一下新IP,更新工具里的配置。这种方案省事,但不够稳,尤其当你频繁重启、IP总变的时候,会非常烦躁。
更好的方案是给虚拟机设置一个固定的地址。实现方式有两种:一种是在虚拟机的网络配置文件里直接写死IP,让它不再依赖DHCP;另一种是在虚拟网络管理界面里为他做DHCP地址保留,确保路由器每次分配给同一虚拟机的MAC地址都下发同一个IP。后一种不会影响虚拟机的配置,体验比较优雅,适合想长期稳定使用多台虚拟机的场景。
不管用哪种方案,目标就一个:让虚拟机的IP固定下来,之后SSH工具里配置一次,后面就不用在改地址上折腾了。
3. Windows下选哪款SSH工具:横向对比和我的选型思路
很多人第一次接触SSH是在Windows的命令行里敲ssh 用户名@IP。这种方式完全可用,但有个前提:命令行窗口本身的功能比较朴素,没有会话管理、没有SFTP文件浏览、没有日志配色,用起来跟专门的SSH工具相比,体验差距明显。我推荐在Windows上装一个专门的SSH客户端工具,让连接和管理都集中在一个界面里。
3.1 几款常用工具的对比
我常看到有人纠结选哪一款。其实不用太纠结,看你的核心诉求是什么。下面是我用过之后比较客观的感受,整理成表格方便对比:
| 工具 | 优点 | 不足 | 适合人群 |
|---|---|---|---|
| Windows自带OpenSSH | 无需安装,命令行直连 | 会话管理弱,多标签体验差;文件传输需配合scp | 偶尔远程一次的人 |
| XShell | 免费版足够用,专业终端体验,多标签、颜色配置丰富 | 需要官网注册获取免费许可;对服务器连接管理友好 | 日常登录Linux服务器的开发者 |
| FinalShell | 集成文件管理、CPU内存实时监控 | 全功能版收费;部分功能对新手反而花哨 | 喜欢图形化看状态的用户 |
| MobaXterm | 免费版功能全面,多标签、SFTP、远程桌面都在一个窗口 | 上部功能按钮略多;免费版有限制会话数 | 多工具需求集于一身的人 |
| Tabby终端 | 界面现代,开源免费,可插件扩展 | 部分功能需要依赖Node.js环境 | 喜欢折腾配置的进阶玩家 |
横向对比后你会发现,其实没有哪一个“最好”的工具,只有最适合你习惯的那一个。对大多数人来说,选一款免费、支持多标签、集成基础的SFTP文件浏览、界面不丑陋的,就够了。
3.2 我为什么不用控制台自带工具
核心原因就一句话:控制台自带工具把“登录终端”和“传输文件”这两件事拆得太远。你在命令行里敲scp传文件,每次都要写完整的路径,传完了想看一眼远程目录下的文件,又要再敲一遍命令列目录。而像MobaXterm或FinalShell这类集成工具,左边直接是文件列表,鼠标拖拽就能上传下载,遇到要改配置文件的场景,甚至能直接在图形界面里编辑,体验完全是降维打击。
再者就是多会话管理。控制台每开一个窗口就是独立的,还没法保存分组;专用工具可以给每个会话保存好IP、用户名、备注名,右键就能连,对我们这种经常要管理三四台虚拟机的场景来说,节省下来的时间非常可观。
4. 从工具到虚拟机:首次连接完整实操拆解
接下来是最关键的部分,我把从零到一的完整流程拆开,每一步都给出明确说明,跟着走就行。我以MobaXterm为例,但这套步骤在任何SSH工具里都是相通的,只要把界面上的项目名换一下即可。
4.1 在虚拟机里启动SSH服务
连接之前,先确认虚拟机里有SSH服务端在运行。大多数主流Linux发行版默认装了OpenSSH,但有些精简版或特殊环境可能没有。在虚拟机终端里执行:
ps -ef | grep sshd有输出说明SSH服务进程已经存在。如果没有输出,就需要手动安装。Debian系(比如Ubuntu)用:
sudo apt update sudo apt install openssh-server -yRedHat系(比如CentOS)用:
sudo yum install openssh-server -y装好之后启动并设置开机自启:
sudo systemctl enable --now sshd装完后为了保险,可以再确认一下端口有没有监听:
ss -tlnp | grep :22能看到0.0.0.0:22或[::]:22在LISTEN,说明一切正常。这一步最常见的问题,就是用精简镜像装完系统之后根本没有安装SSH服务,然后拿着工具连,报connection refused,完全摸不着头脑。
4.2 填写连接参数
回到宿主机,打开SSH工具,新建会话。需要填的量并不多:
- 主机地址:之前查到的虚拟机IP,比如
192.168.31.128 - 端口:默认是22,除非你改过
- 用户名:你想登录的账户,比如
ubuntu或test - 密码:对应账户的密码(密钥登录的情况后面单独说)
填完之后先别急着保存密码,第一次建议还是手动输入一次,确认账号没问题。点击连接后,工具会弹出第一次连接的指纹确认提示,意思是想确认这个远程主机的身份是不是可信的,直接选信任/接受并保存,后续连接就不会再问。
4.3 首次登录和中文乱码问题
密码验证通过之后,你会看到Linux的Shell提示符,比如ubuntu@ubuntu:~$。这时候SSH连接就算正式建立了。输入几个基础命令验证一下:
w free -m df -h分别查看在线用户、内存和磁盘使用率,能正常输出,说明连接完全可用。
这里有个很多人会遇到的问题:在终端里看到中文文件名变成乱码。这通常是编码设置不对。将客户端的字符编码设置从默认改成UTF-8,大部分发行版默认就是UTF-8编码,改完就正常了。XShell、MobaXterm都在会话属性里能找到字符编码选项。
4.4 配置密钥登录,彻底告别密码
如果你需要在虚拟机上频繁登录,每次都输密码有点烦,而且密码还有被键盘记录的风险。更优雅的方式是用密钥对登录,把公钥放到虚拟机上,之后连接时自动走验证,不需要手动输密码。
先在宿主机生成一对密钥:
ssh-keygen -t ed25519 -C "local-user@host" -f ~/.ssh/vm_key一路回车(也可以为密钥设置一个口令),会生成两个文件:vm_key是私钥,自己留着;vm_key.pub是公钥,需要放到虚拟机上。
把公钥拷贝到虚拟机上:
ssh-copy-id -i ~/.ssh/vm_key.pub 用户名@虚拟机IP这个命令会自动在你的用户目录下创建.ssh/authorized_keys文件并把公钥追加进去。下次连接的时候,在SSH工具里选择刚才生成的私钥文件,就能免密登录了。
如果没有ssh-copy-id命令(比如在Windows的某些环境下),可以手动把公钥内容追加到远程机器的~/.ssh/authorized_keys文件末尾:
mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys echo "你的公钥内容" >> ~/.ssh/authorized_keys记住一个关键坑:~/.ssh目录权限要设置成700,authorized_keys文件权限要设置成600,否则SSH服务端会认为权限过于开放,直接拒绝公钥认证,让你去输密码,这一步我帮别人排过好几次错。
5. 连不上的排查全记录:按链路一步步定位
连接失败的时候,不要慌,也不要东点一下西点一下。我习惯按照一条链路,从最底层到最上层逐步排查,思路非常管用。这条链路依次是:虚拟机本身的状态 -> 网络能否到达 -> 端口能否连接 -> SSH服务是否正常 -> 认证是否通过。
5.1 第一步:确认虚拟机还活着
很多人第一步就栽了。排查之前先确认虚拟机确实开着、没有卡死、系统进入到了可以登录的状态。这一步没法通过SSH查,只能回到VM控制台窗口看看。
5.2 第二步:测试宿主机到虚拟机的网络能否通
在宿主机上打开命令提示符:
ping 虚拟机IP有响应说明网络链路OK。如果ping不通,先排查虚拟机网卡配置和网络模式,忘记你不通的这台虚拟机是否和宿主机不在同一个网段。
一个很常见的翻车场景:虚拟机没开机,你用工具去连,当然连不上。另一个更隐蔽的:你加了块新网卡,系统路由表乱了,导致虚拟机能上网但宿主机就是ping不到它。这时候看路由表:
ip route确认默认路由指向的是你期望的网卡和网关。之前有个同学一直连不上群里的虚拟机,查了半天发现虚拟机的默认路由走的是虚拟网卡,跟宿主机通信不经过SSH所在的那张物理网卡,数据包有去无回。把路由规则理顺之后就正常了。
5.3 第三步:检查端口是否处于可达状态
网络通了,不代表22号端口一定可以连。在宿主机上测试端口:
telnet 虚拟机IP 22如果连接被拒绝或超时,说明SSH服务端没在监听,或者防火墙拦截了。也可以在宿主机上用:
nc -vz 虚拟机IP 22如果用这条命令能显示连接成功,说明端口是开的。反过来如果端口不通,再用虚拟机内部的ss -tlnp确认服务监听状态,以及防火墙规则:
sudo firewall-cmd --list-all检查有没有放行22端口。有些发行版默认防火墙没开,有些开了但只放行了几个端口,SSH被人为挡在门外。看到连接被拒的时候,第一反应应该是防火墙或者SSH服务挂了,而不是怀疑自己的工具填错了。
5.4 几种报错信息的含义
每个报错背后对应的原因,其实很有规律,我把常见的情况整理到表格里:
| 报错信息 | 原因 | 解决办法 |
|---|---|---|
| Connection timed out | 网络不可达 | 检查虚拟机IP是否变化、网卡是否启用、网络模式 |
| Connection refused | SSH服务没启动或防火墙拦截 | 确认sshd存在且运行;放行22端口 |
| Host key verification failed | 远程主机密钥变化(重装系统常见) | 在~/.ssh/known_hosts里删除旧记录 |
| Permission denied (password) | 密码错误或密码认证被关闭 | 确认密码正确;检查sshd_config里的PasswordAuthentication |
| Permission denied (publickey) | 公钥认证失败 | 检查密钥权限、authorized_keys内容、密钥文件是否选对 |
还有一个很有意思的坑,是“明明密码是对的,却一直提示Permission denied”。这种情况多半是sshd服务端配置文件里设置了禁止密码登录,只允许公钥登录。如果你手头没有可用的公钥,可以直接把虚拟机的sshd_config里的PasswordAuthentication改回yes,重启服务再试。
排查完认证,整个链路的思路就闭环了。以后再遇到连接问题,不需要像无头苍蝇一样乱撞,只要照着链条一层层往上排查,总能找到卡点。
6. 首次连接之后的进阶玩法:让SSH连接更顺手也更安全
第一次连接成功只是开始。连接本身不算难,难的是后面怎么把SSH用起来、用得好。下面是我自己长期用下来觉得最值的几个配置项和玩法,分享出来供你参考。
6.1 用配置文件保存主机信息
如果你每天要连的虚拟机、服务器很多,每次打开工具都要一顿点选很麻烦。可以先在SSH工具里把会话分组,按项目或环境分好类,保存下来,每次双击就能登录。这点通常有点被新人忽略,但用过一阵子之后,会省下大量时间。
也可以使用SSH自带的配置文件方式管理主机:
nano ~/.ssh/config每台机器用一段简单配置描述:
Host vm1 HostName 192.168.31.128 User ubuntu Port 22 IdentityFile ~/.ssh/vm_key下次直接执行ssh vm1就能连上,再也不用记IP了。这个文件可以在宿主机上用任意编辑器改,改完即时生效,适合命令行固执派。
6.2 让文件传输不再局限于scp
SSH连上之后,文件传输最基础的命令是:
scp 本地文件 用户名@虚拟机IP:/目标路径但这个命令每次都要写完整主机名,不够优雅。有经验的用户会用scp配合~/.ssh/config里的别名,写成scp a.txt vm1:/home/ubuntu/,简洁很多。
另外我强烈建议用集成SFTP的SSH客户端,边浏览边传输,体验马上不一样。用MobaXterm或FinalShell这类工具的图形文件面板,可以像操作本地文件一样拖拽传输,效率提升巨大。
6.3 别用root裸奔:安全和体验的取舍
很多新手为了省事,直接给虚拟机设置了root密码,然后用SSH工具以root身份连接。这样确实省去了sudo的操作,但风险也随之而来:一旦密码泄露,整个系统就完全暴露了。更稳妥的姿势是平时用普通账户登录,需要管理员权限时再sudo,避免高频使用root账号。
还有几个安全习惯我一直在坚持,顺手分享出来:
- 如果不需要从公网访问虚拟机,就不要暴露22端口到外网
- 尽量用密钥登录,把密码登录禁掉
- 如果一定要开密码登录,用高强度密码,不要用物理键位顺序那种弱密码
- 修改密钥或者新增SSH配置之后,记得重启sshd服务确认没配错
6.4 远程开发与本地编辑:SSH的价值不只在敲命令
连接稳定之后,你可以把SSH用得更深。例如用VSCode的Remote-SSH插件,直接在本地编辑器里打开虚拟机的项目目录,代码高亮、智能提示、远程运行全部搞定。写代码体验跟本地几乎一样,特别适合在虚拟机里跑测试的场景。
还有一个常用思路是端口转发,能让宿主机直接访问虚拟机里运行的服务。比如虚拟机上跑了一个Web应用,监听8080端口,你可以在SSH会话里设置隧道,让宿主机通过localhost:8080访问虚拟机上的服务:
ssh -L 8080:localhost:8080 vm1这样的话,虚拟机的图形界面不开也没关系,浏览器直接访问本地地址就能看到应用效果。整个工作流清爽了很多,也不再需要依赖虚拟机控制台窗口的放大缩小了。
把前面这些配置都顺下来之后,你会发现SSH连接虚拟机这件小事,从“能用”到“好用”之间,差的恰恰就是这些细节。我自己的习惯是每次新建虚拟机之后,第一件事就是把网络固定好、SSH服务装好、密钥登录配上,之后再开始折腾别的。磨刀不误砍柴工,这套流程跑顺之后,后面的所有操作都会快很多。