1. 为什么用XShell连虚拟机先搞懂这是要解决什么问题做开发或者学Linux的朋友应该都有这种经历VMware里开着一台Ubuntu平时要么直接在虚拟机窗口里敲命令要么用Windows自带的cmd去ping一下。说实话虚拟机窗口用起来真的挺别扭的——复制粘贴经常失效鼠标要按CtrlAlt才能释放窗口一多还容易切错更别提终端配色、字体、多标签这些体验了。XShell远程连接虚拟机终端本质就是解决一个问题把虚拟机里Linux的终端操作搬到Windows桌面上来。你在XShell里敲的命令实际是在虚拟机里执行的你看到的输出是虚拟机里的实时反馈。而XShell作为Windows下一款老牌的SSH终端工具连接稳定、轻量、支持多标签、还能保存多台服务器的连接配置很多运维和开发都在用。这个方案能解决的核心痛点有这么几个。第一操作体验上的飞跃XShell支持Windows下的字体渲染和复制粘贴选中即复制、右键即粘贴比VMware窗口里方便太多了。第二多会话管理你可以同时开着三四台虚拟机的终端每个标签一台机器切换就是点一下的事。第三脱离虚拟机窗口使用显示器上桌面不会那么乱虚拟机窗口可以最小化甚至设置为无界面启动SSH是你和虚拟机之间的唯一通道。适合谁来参考刚装好VMware、想在Windows上用XShell连上Linux的新手是最典型的读者。已经工作但习惯直接在虚拟机里操作的开发也能从这篇文章里找到更高效的连接方式和排查思路。无论你是为了学Linux、搭开发环境还是准备把虚拟机当服务器用这套流程都绕不开。2. 虚拟机网络模式怎么选NAT、桥接、仅主机模式的核心逻辑2.1 先理解三种网络模式的差别远程连接虚拟机的第一步是让Windows宿主机和虚拟机之间能通网络。VMware给了三种网络模式很多人一看到VMware网络编辑器就懵我先用大白话拆一下。NAT模式默认虚拟机通过宿主机共享网络上网。相当于宿主机是一台路由器虚拟机是家里的一台设备。对外网来说只有宿主机一个IP虚拟机藏在后面。宿主机可以直接访问虚拟机虚拟机也可以访问宿主机。这个模式的好处是只要Windows能上网虚拟机就有网不需要关心路由器设置最省心也是绝大多数场景下最推荐的。桥接模式虚拟机直接接入局域网相当于它是一台独立的电脑和宿主机平级。别人在局域网里也能直接SSH到虚拟机适合需要让其他电脑访问这台虚拟机的场景。但桥接模式依赖你的网络环境有些公司网络有绑定MAC地址或认证限制这时候就不好使了。仅主机模式虚拟机只能和宿主机通信不能访问外网。适合完全隔离的测试环境但对大多数刚开始用的人没必要。我自己的习惯是本地开发和练习一律NAT省事且稳定。如果你后面要在虚拟机上搭一个服务想让手机或同事直接访问再考虑桥接。2.2 实际操作VMware中确认网络模式打开VMware选中你的虚拟机右键 - 设置 - 网络适配器勾选“NAT模式”。这一步非常关键网上很多人报的“XShell连不上虚拟机”排查下来一大半是网络模式不对或者虚拟机里装了两块网卡导致网络混乱。虚拟机系统的网卡通常会自动获取IP。在虚拟机里执行下面命令就能看到IPip addr或者老一点的系统ifconfigNAT模式下虚拟机的IP一般长这样192.168.20.x。这个网段在VMware里是虚拟出来的真正的网段取决于“虚拟网络编辑器”。为了后面排查方便我强烈建议你顺手打开VMware的“编辑” - “虚拟网络编辑器”看一眼NAT模式的网段是多少。还有一个小坑VMware在Windows上跑依赖两个服务——VMware NAT Service和VMware DHCP Service。这两个服务如果不运行虚拟机的NAT网络就是坏的表现就是虚拟机分不到IP、连不上网。排查方法我后面专门讲这里先记住大概方向。2.3 网络通了别忘了检查宿主机到虚拟机的直达性网络结构搞清楚之后建议先做一次宿主机的探测。在Windows的cmd窗口里执行ping 虚拟机IP比如ping 192.168.20.130。能ping通说明网络层面OK。如果ping不通后面SSH连接基本没戏。这里有两点要提前说清楚一是如果ping不通先别急着怀疑防火墙先回到网络模式和服务状态上排查。二是如果虚拟机开了防火墙默认可能屏蔽ICMP导致ping没反应但SSH的22端口可能已经放行了所以ping不通不代表SSH一定连不上。但从经验上讲先保证ping通再进SSH是最稳妥的路径。3. 虚拟机端SSH服务部署从安装到放行防火墙3.1 安装OpenSSH服务端XShell连上虚拟机走的是SSH协议。虚拟机端必须装了SSH服务端软件并且处于运行状态你才能连得进来。Ubuntu系统和CentOS系统的安装命令不一样对新人来说最容易踩的就是这里。Ubuntu/Debian系在终端里执行sudo apt update sudo apt install openssh-server -y装完之后检查服务是否运行sudo systemctl status ssh看到active (running)就说明服务在跑。如果没运行执行sudo systemctl start ssh启动。CentOS/RHEL系命令是sudo yum install openssh-server -y sudo systemctl start sshd sudo systemctl enable sshd提醒一句Ubuntu的SSH服务名是sshCentOS是sshd两个系统名字不一样很多人照抄命令结果服务名不存在就卡住了。为了开机自启建议执行sudo systemctl enable sshUbuntu装完openssh-server以后服务默认是启动的。但保险起见还是要确认这两步因为有的最小化安装镜像不带SSH服务或者服务被安全策略停掉了。3.2 防火墙配置放行22端口虚拟机系统里如果开启了防火墙SSH的默认端口22可能被拦。Ubuntu的默认防火墙是ufwCentOS是firewalld。Ubuntu上放行22端口sudo ufw allow 22CentOS上放行sudo firewall-cmd --add-port22/tcp --permanent sudo firewall-cmd --reload这里多说一句很多人连不上虚拟机第一反应就是关防火墙。但从经验上讲你只要把22端口放行了就行没必要把防火墙整个关掉。因为如果你是用NAT模式虚拟机对外的网络活动都是通过宿主机做的能访问它的也只有宿主机和宿主机所在的内网。保留防火墙只是少一个安全隐患而已。3.3 SSH登录方式的选择密码还是密钥XShell连接虚拟机认证方式主要有两种密码认证和密钥认证。新手刚开始用密码认证就好这是最快的方式。配置方法我下一章跟你说明。但是这里有一个经常被忽略的安全问题root账号直接密码登录在默认配置下Ubuntu是不允许的。如果你非要用root用户连接需要修改SSH配置文件sudo vi /etc/ssh/sshd_config找到PermitRootLogin改成yes再重启SSH服务。不过我的建议是初学阶段就用普通用户连练熟了之后再做进阶操作。普通用户权限不够的时候命令前加sudo就行完全够用。用root直连的风险不是“连不上”的问题而是万一你输入错一条命令代价远大于普通用户。4. XShell安装与会话配置从下载到首次连接成功4.1 XShell下载与安装XShell的官网版本有商业版和个人免费版个人使用选免费版即可。下载时注意区分不要下成XShell Plus或其他工具。安装过程没什么特殊的一路下一步就行。这里有个经验XShell最新版本默认会带上一些安全加固的功能比如“主机密钥校验”首次连接时可能弹出警告窗口。这个我们后面再说。安装完之后界面是英文的但菜单结构很简单不用被吓到。4.2 新建会话五个关键参数的说明打开XShell点击左上角“新建”按钮或者按快捷键CtrlN进入会话配置界面。这里需要逐个把参数确认好名称给这个会话起个好认的名字比如“Ubuntu-NAT”方便以后找到。主机填虚拟机IP这个IP是你在虚拟机里通过ip addr查到的那个不能填错。协议默认就是SSH不用动。端口对应22默认也是填好的。用户名填你虚拟机里的登录用户名比如zhangsan或ubuntu。认证方式选Password后面连接的时候会提示你输入密码。如果用密钥认证这里就换成Public Key并选择对应的私钥文件。我建议把“用户身份验证”这一页填好这样每次连接会省掉一次手工输用户名和密码的步骤。但如果是多用户共用电脑不要在这台电脑上保存密码安全性优先。配置完之后点击“连接”。首次连接会弹出“SSH安全警告”大致意思是XShell无法确认虚拟机的主机密钥问你是否接受。这就是正常的首次连接提示选“接受并保存”即可。如果后面你重装了虚拟机系统这个提示还会再弹因为主机密钥变了接受一次就好。4.3 连接成功之后的第一件事确认终端交互连接成功后XShell窗口会显示虚拟机的命令行提示符。这时候你可以敲一条简单的命令验证一下ls -la uname -a输出正常就说明这个SSH终端已经完全接管了虚拟机。你在XShell里执行的每个命令后台都是在虚拟机上跑的。从这一步开始你可以把VMware窗口最小化甚至隐藏起来日常操作基本交给XShell就够了。还有一个非常提高效率的小功能——快速命令栏。XShell底部有一个快速命令集面板你可以把常用命令加进去比如cd /var/log、systemctl restart nginx点一下就执行省得每次打一长串。这个习惯一旦养成就不想再回到普通终端里去了。5. 连接失败怎么排查按报错类型区分处理5.1 故障一“远程计算机拒绝连接”或“连接超时”这应该是开启SSH前最常遇到的报错。XShell连接时如果直接提示Connection refused说明IP地址和端口是可达的但虚拟机上的SSH服务不在监听。最常见的原因是openssh-server没安装或者服务没启动。回到第3章执行sudo systemctl status ssh看看状态再说。如果提示的是Connection timed out这个含义完全不同说明网络层面根本没有走到虚拟机。优先排查顺序是检查虚拟机和宿主机的IP是否在同一个网段尤其NAT模式。在Windows cmd里ping一下虚拟机IP不通就继续下一步。确认VMware的两个网络服务NAT Service和DHCP Service在Windows服务列表里处于启动状态。我印象很深的一次排错VMware的NAT服务被某次系统更新或者清理工具误停了虚拟机的IP变成了169.254.x.x这种自动分配失败地址XShell怎么连都是超时。打开服务列表把VMware NAT Service设为自动并启动虚拟机重启网络服务后IP恢复正常连接就通了。5.2 故障二SSH连接报“算法协商失败”或“主机密钥错误”新版本的XShell默认配置下可能会跟旧版Linux里的SSH服务端有算法兼容性问题。我遇到过一次Ubuntu 18.04系统里默认的ssh版本偏老新XShell默认使用的某些加密算法它在协商时不支持直接报no matching key exchange method之类的错。解决办法有两个方向一是升级虚拟机里的OpenSSH执行sudo apt update sudo apt upgrade openssh-server二是直接在XShell对应会话的“连接” - “SSH” - “加密”选项卡里勾选“启用旧版算法兼容”相关选项。XShell目前已经有这个开关打开之后能兼容老系统。建议以升级服务端为主不要长期依赖兼容模式。5.3 故障三认证失败或反复提示输入密码报Authentication failed说明网络和服务都正常卡在了身份验证上。先确认用户名有没有写错再确认密码。Ubuntu用户登录密码就是你自己设置的密码这点通常不会出问题。还有一个容易忽略的点是XShell里配置了公钥认证但私钥文件加载失败它就会退回密码认证。如果在“用户身份验证”里选了Public Key但又没有正确指定私钥就会只提示认证失败。这时候回到会话属性里把认证方式先改回Password确认能连上再研究密钥登录。5.4 更省心的方法给虚拟机配置固定IP经常出现的一种体验是昨天还连得好好的今天虚拟机重启之后XShell连接直接超时。原因是NAT模式下虚拟机的IP是DHCP分配的重启后很可能变化。你查一下虚拟机新的IP在XShell里改一下会话的“主机”一栏就又能连上了。但每次都查IP也很烦建议给虚拟机配置一个固定IP。Ubuntu 18.04及以前改/etc/network/interfacesUbuntu 20.04以后用netplan。比如在/etc/netplan/里的yaml文件配置一个跟虚拟网卡同网段的静态地址network: version: 2 ethernets: ens33: dhcp4: no addresses: - 192.168.20.130/24 gateway4: 192.168.20.2 nameservers: addresses: [192.168.20.2]注意NAT模式下网关通常是192.168.20.2你的VMware虚拟网关DNS也可以用网关地址。改完执行sudo netplan apply。这样之后虚拟机的IP就固定了XShell里配置一次以后基本不会再因为这个原因失联。5.5 常见问题速查表现象可能原因排查方向连接超时网段不通、VMware服务停止ping虚拟机IP检查服务拒绝连接未安装SSH服务systemctl status ssh认证失败用户名或密码错误检查认证配置改回密码认证算法协商失败SSH版本过旧升级openssh-server主机密钥警告虚拟机重装过系统接受新密钥即可IP变化连不上DHCP重新分配查IP并更新会话或配置固定IP6. 日常使用中的几个实用技巧6.1 同时管理多台虚拟机XShell的多标签特性做得很顺手。你可以给每台虚拟机建一个会话打开时全部放在同一个窗口的不同标签里。如果后面要在多台机器上执行同样的命令可以右键标签 - “发送全部输入到当前会话”这样你在当前标签里敲的命令会同步发到其他标签对应的虚拟机适合批量修改配置这种场景。这个功能以前叫“全局发送”用好了效率翻倍。6.2 文件传输不用再开FTPXShell可以配合Xftp使用但如果你不想另外装软件还有更轻量的方式。SSH连接保持的情况下直接在命令行里用scp就能从宿主机往虚拟机传文件。在Windows cmd里执行scp 本地文件路径 用户名虚拟机IP:/目标路径比如scp D:\test.zip zhangsan192.168.20.130:/home/zhangsan这样传文件连Xftp都省了。如果你的电脑上装了Git它自带的scp命令在Windows cmd里也能直接用也是我比较推荐的方式。6.3 会话保持与断线重连远程终端用的时间一长经常会出现“卡着不动”的情况。这往往是SSH连接已经断开客户端没感知。XShell有“保持活动状态”的设置在“连接” - “代理”同级的“高级”里有“发送保持活动状态消息”的选项间隔时间可以设为30秒或60秒。这样即便网络有短暂的闪断或者虚拟机休眠XShell也能主动感知并维持连接而不是等到你敲命令才发现卡死了。还有一个实用设置在“查看”菜单里勾选“跟踪光标”输出日志的时候终端不会乱跳看报错信息舒服很多。7. 我的实操体会XShell连接虚拟机这件事本身并不难但很多人栽就栽在“没有按顺序排查”上。我的习惯顺序永远是先看网络通不通再看SSH服务在不在再检查用户名密码对不对最后才怀疑工具本身。按照这个顺序走下来几乎百分之九十九的连接问题都能定位到具体原因。另外一个心得是别偷懒能配固定IP就配固定IP。虽然写死IP看起来多了一步操作但长远来看它省掉的是你每次开机都要去虚拟机里查一次IP的时间也让XShell的会话配置真正稳定下来。如果你正在折腾Linux虚拟机不管是学命令、搭环境还是跑测试用XShell这套方案把终端从VMware窗口里“解放”出来会明显感觉到整个操作过程顺畅很多。后面要做密钥登录、端口转发、跳板机这些进阶操作时XShell也都能胜任。先把这条基础链路跑通后面什么都能接得上。
