平时开发、测试,我习惯在VMware里开一台Linux虚拟机。系统装好之后,图形界面打开越用越卡,复制粘贴命令还经常出各种怪问题。次数多了,我干脆把所有操作都挪到XShell里做——用XShell远程连接虚拟机终端,然后所有敲命令的操作都在这个轻量的终端窗口里完成。这篇文章给准备用XShell连虚拟机、却被各种报错卡住的朋友,会把网络配置、SSH服务、IP获取、连接配置、问题排查这些环节从头到尾捋一遍,既适合完全没有远程连接经验的新手,也适合遇到连接失败想找完整排查思路的同行。
先说明适用范围:本机装VMware Workstation或VirtualBox,虚拟机里跑Ubuntu或CentOS,然后从宿主机发起连接。这套方法对云服务器、局域网内其他Linux主机同样成立,只是IP地址的来源和获取方式略有不同。整体操作链路其实不复杂,就三步:先让虚拟机的网络通、SSH服务就绪,再拿到虚拟机的IP,最后在XShell里建会话连上去。真正让人卡住的从来都不是这三步本身,而是细节——网络模式选错、服务没启动、防火墙挡端口、IP找错、密码被系统策略锁住,这些坑我会一个一个展开讲。
1. 为什么绕不开XShell:虚拟机终端连接的真实场景
1.1 图形界面很好,但日常操作我更信任终端
虚拟机里的图形桌面能干很多事,浏览器、编辑器、文件管理器都很直观。但在真正的服务器管理场景里,绝大多数操作还是在终端里完成的。原因很朴素:轻、快、可复制。
轻,是说XShell这个客户端本身只有几十兆,跑起来占用资源特别少,不像虚拟机图形界面那样吃内存和CPU。我本地一台机器同时开两个虚拟机,如果都用图形桌面,鼠标拖一下都费劲,关掉图形桌面只跑命令行,负载肉眼可见地降下去。
快,是说命令行的操作路径比鼠标点选短得多。查日志、改配置、重启服务、批量操作文件,几个命令就完成了,不用在窗口里一层层点目录。
可复制,这个体验差异最明显。XShell里从网页、文档复制一段命令,直接Ctrl+V就进去了,格式不会乱;反过来从终端复制输出,也直接就是纯文本,不像在VMware图形窗口里复制,经常把带高亮颜色的乱码也粘进来。
所以我现在的习惯是:虚拟机装好之后,图形界面只用来做初始配置,日常管理一律通过XShell远程连终端来完成。这种方式也更接近生产环境的管理方式——在真实服务器上,你可能根本没有图形界面可以打开。
1.2 XShell、VMware自带终端、Windows Terminal、VS Code Remote怎么选
有朋友问过我:既然Windows自带的终端能用ssh命令,VS Code也能远程连服务器,为什么还要单独装XShell?这几种方案各有适用场景,我说下自己的取舍。
| 工具 | 适用场景 | 短板 |
|---|---|---|
| XShell | 日常运维、批量管理多台主机、传文件 | 商业软件,个人免费,商业使用需授权 |
| VMware原生控制台 | 虚拟机开机引导、图形界面救援、没装SSH时的紧急入口 | 窗口体验差,复制粘贴别扭,每台虚拟机都要单独开窗口 |
| Windows Terminal + ssh命令 | 临时连一两台机器,不想装额外软件 | 会话管理弱,机器一多就乱,密钥配置也要手动搞 |
| VS Code Remote-SSH | 边写代码边连服务器,需要图形化编辑器 | 启动重,纯终端操作不如XShell轻便,多会话管理一般 |
我的建议是:如果你只是偶尔在虚拟机里敲两行命令,Windows Terminal完全够用;如果你要频繁连接多台虚拟机,还要传文件、保存会话、记录操作日志,XShell的效率要高得多。文章后面讲的排查思路对所有SSH客户端都通用,不是只能用在XShell上。
1.3 XShell免费版够用吗
XShell有两个版本:商业版和个人版。个人使用、家庭使用、学生使用不收费,功能上日常最常用的都有——SSH、SFTP、多标签页、密钥管理、快速命令、日志记录,免费版全都有。只有商业用途需要购买授权。
说白了,绝大多数人用到的就是SSH终端+SFTP传文件这两块,免费版绰绰有余。没必要一上来就找破解或者老版本,用官网的个人版,功能正常、安全更新也有保障。
2. 连接前必须搞定的三件事:网络模式、SSH服务、IP地址
2.1 虚拟机网络模式到底怎么选:NAT、桥接、仅主机
这一节是最多人踩坑的地方。很多人虚拟机装好了,打开XShell输IP,怎么都连不上,问题就出在网络模式上。VMware里给虚拟机配置虚拟网卡时,有三种模式:NAT、桥接、仅主机。
NAT模式是VMware的默认模式。虚拟机的网卡通过宿主机的VMnet8虚拟网卡做网络地址转换,虚拟机可以访问宿主机,也可以通过宿主机上网,但外界访问不到虚拟机。听起来好像很封闭,但对XShell远程连接虚拟机这件事来说,完全不耽误——因为连接是从宿主机发起的,宿主机和虚拟机在同一个虚拟网络(VMnet8)网段里,宿主机可以直接访问虚拟机的IP。这是最推荐的模式,网络环境简单,不需要依赖外部路由器的DHCP。
桥接模式相当于虚拟机直接接入了你所在局域网,它有自己的局域网IP,看起来就像房间里的另一台电脑。好处是局域网里的其他机器也能访问它,比如你手机、另一台工作电脑也想连这台虚拟机,桥接就合适。但桥接模式依赖外部网络环境,如果路由器没开DHCP、办公楼网络有端口隔离,虚拟机可能拿不到IP,反而增加连接难度。
仅主机模式的虚拟机只能和宿主机通信,不能上网,主要用于做网络实验、测试隔离环境,日常管理没必要选。
很多新手容易犯的错是:在NAT模式下,顺手给虚拟机配了一个和宿主机同网段的静态IP,结果虚拟机既上不了网,宿主机也ping不到它。记住,NAT模式下虚拟机的IP属于VMnet8网段,不是你的局域网网段,让它自动获取或者按VMnet8网段手动配置都行,就是别按局域网网段瞎配。
2.2 给虚拟机安装并启动SSH服务
XShell连接虚拟机走的是SSH协议,所以虚拟机里必须装了SSH服务端。很多精简版系统镜像、或者你在安装时没选SSH组件,系统里压根没有这个服务,表现出来就是XShell提示"远程计算机拒绝连接"。
Ubuntu/Debian系列,安装和启动就几条命令:
sudo apt update sudo apt install -y openssh-server sudo systemctl enable --now sshenable是设置开机自启,now是立即启动。装完检查一下服务状态和端口监听:
systemctl status ssh ss -tlnp | grep 22看到22端口有监听就对了。CentOS/RHEL系列略有区别,服务名是sshd:
sudo yum install -y openssh-server sudo systemctl enable --now sshdCentOS还要注意防火墙。有防火墙就放行SSH,没有就直接跳过:
sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reloadUbuntu如果启用了UFW防火墙,也要放行:
sudo ufw allow 22/tcp这里提一个实践上的建议:如果就是想快速跑通连接,可以先临时关掉防火墙,把链路打通之后再考虑安全加固。等确认XShell能连上,再按上面的命令放行端口或者重新开启防火墙,避免防火墙规则写错导致排障时分不清是网络问题还是服务问题。
2.3 三种方式拿到虚拟机的IP
SSH服务装好了,下一步是知道往哪里连。虚拟机里执行下面任何一个命令都能看到IP:
ip addr show重点看ens33、eth0、ens160这种网卡的inet字段,类似192.168.xxx.xxx这样的就是虚拟机的IP。如果ip命令的输出看着费劲,也可以:
hostname -I这条命令会直接列出一行IP地址,没有其他干扰信息,拿来填XShell的主机地址正合适。传统ifconfig命令在新系统里默认没有,需要装net-tools包,能不装就不装,用ip命令就行。
拿到IP之后,从宿主机验证一下网络通不通:
ping 192.168.xxx.xxx能ping通则网络正常,接着打开XShell建会话。连不通则按本文第4节的排查思路走。这里多说一句,很多人搞不清"拿到了IP为什么还是连不上"——IP只是找到主机,能不能连上还要看SSH服务听没听、防火墙放没放行,所以拿到IP之后先ping,再继续排障,是效率最高的顺序。
3. XShell端配置实战:新建会话、连接参数与首次握手
3.1 新建会话的完整流程
打开XShell主界面,文件菜单里选择"新建",或者直接点工具栏上的新建按钮。我习惯用快捷键Ctrl+N,速度最快。
会话属性窗口里需要填的内容并不多,核心就这几个:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 协议 | SSH | 加密传输,登录后数据不会被抓包看到明文 |
| 主机 | 虚拟机的IP地址 | 填2.3节里拿到的IP |
| 端口号 | 22 | SSH默认端口,改了服务端配置就填对应端口 |
| 用户名 | 你的Linux登录用户名 | 例如ubuntu、root、centos |
| 认证方法 | Password(密码) | 第一次连接先用密码登录,后面可以换成密钥 |
填好之后点连接,第一次连接一个全新主机,XShell会弹出提示,问你是否接受这台主机的SSH主机密钥。这里直接接受并保存就行,它的作用相当于确认"我连的就是我以为是的那台机器",防止中间人冒充。
接着就是输入密码。密码正确,就进入了虚拟机的终端界面。看到类似root@ubuntu:~#的提示符,说明连接已经成功。首次连接顺利的话,整个过程也就十几秒。
3.2 连接参数与终端外观的细节
XShell连接成功后,有几个参数值得根据使用习惯调整,不然用起来总觉得别扭。
编码设置很关键。默认会话如果终端里中文全是乱码,多半是编码不对。在会话属性里把终端页面的编码设置为UTF-8,基本能解决99%的乱码问题。Ubuntu和CentOS现在的默认语言环境都是UTF-8,这块设置好以后,中文文件名、中文日志输出都能正常显示。
终端类型保持xterm就行,不用改,这个参数影响的是终端模拟器对特殊键位、颜色控制序列的支持,xterm兼容性最好。
外观设置比较个性化,字体推荐Consolas或者等宽字体,字号看个人习惯,我一般用11号或12号。配色方案XShell自带了几个,深色背景配浅色文字用久了眼睛舒服一些。光标类型我喜欢用竖线,选中文本时高亮颜色要明显,方便监听状态时扫过去就能看见输出。
还有一个容易被忽略的选项:会话属性里的"连接"设置,默认有个保持活着的选项。VMware虚拟机跑久了、宿主机休眠过,SSH连接容易断。把保持活着的间隔设置成60秒左右,XShell会定时发一个空包维持连接,避免敲着敲着就卡住等半天才断开。
3.3 新版XShell的界面变化与安装失败处理
XShell 8相比老版本,界面确实做了一些调整,默认配色更偏暗色风格,按钮排布也更紧凑。老用户刚上手可能有点不习惯,但功能入口大方向没变,新建会话、快速命令、密钥管理器这些核心功能都还在原来的菜单逻辑里。
另外有不少朋友反映XShell安装失败。就我接触到的案例,最常见的原因有三个:一是安装包下载过程不完整,文件损坏导致安装程序无法解压;二是杀毒软件或系统安全策略拦截了安装程序;三是之前装过老版本,残留的配置文件冲突。对应的处理办法也很直接:去官网重新下载安装包,确认文件大小和官网显示一致;安装时暂时关闭杀毒软件的实时防护;先卸载旧版本,清理干净安装目录和注册表相关项,再装新的。安装路径尽量用纯英文,不要带中文目录,能省掉很多莫名其妙的权限问题。
顺便提一下XShell 7里增加的密码查看器功能。它可以查看当前会话保存的账号密码,确实方便,但这也意味着密码在会话文件里是可逆存储的。我的建议是:自己电脑上用没问题,但别在公用电脑上保存虚拟机或服务器的登录密码,尤其是root密码。要么每次输入,要么改用密钥登录——这也是我推荐密钥登录的原因之一,第三部分会详细讲。
4. 连接失败排查实录:拒绝、超时、认证三座大山
4.1 "远程计算机拒绝连接"到底是谁在拒绝
这个报错出现时,第一反应不应该是"虚拟机拒绝了我",而是"XShell根本没有找到能说话的对象"。绝大多数情况下,原因是目标端口上没有服务在监听——也就是SSH服务没装或者没启动。
排查链路非常简单,先在虚拟机本机执行:
ss -tlnp | grep 22如果有输出,说明SSH服务正在监听22端口,问题不在服务端;如果没有任何输出,说明服务没起,按2.2节的安装启动命令处理。还有一种可能是端口被改了,比如有人把SSH端口改成了22022,那你在连接时要把端口号也改过来。
确认服务正常后,再从宿主机测试能不能连到该端口。Windows下可以用Test-NetConnection命令:
Test-NetConnection 192.168.xxx.xxx -Port 22返回TcpTestSucceeded为True,说明宿主机的网络能到达这个端口。为False,则问题出在网络层或防火墙,继续看4.2。
4.2 连接超时:先查网络可达性
连接超时和连接拒绝是两类完全不同的问题。拒绝说明端口是通的、服务在应答;超时说明数据包发出去之后根本没有回应,像石沉大海。
先检查虚拟机状态。虚拟机如果处于挂起、已关机状态,任何连接都会超时,先把它开机。这是很多人容易忽略的,特别是装完系统后,测试时顺手点了挂起,回头再连就忘了。
网络模式也要再确认。NAT模式下,虚拟机的网卡要启用,VMware的VMnet8虚拟网卡在宿主机里也要保持启用状态。打开Windows的"更改适配器选项",能看到VMware Network Adapter VMnet8,如果被禁用了,虚拟机网络就断开了。
接着ping一遍虚拟机IP,从宿主机执行:
ping 192.168.xxx.xxx能ping通,说明网络通路没问题,问题可能出在防火墙层面。能ping通但22端口不通,在CentOS上要检查firewalld,在Ubuntu上要检查UFW,具体命令2.2节里已经有了。还有一点,有些环境下防火墙默认策略是丢弃(DROP)而不是拒绝(REJECT),表现就是连接超时而不是连接拒绝,别被表象带偏。
如果ping不通,重点检查虚拟机网卡状态和IP配置。在虚拟机图形界面或者原生控制台里执行ip addr,看网卡是不是没有IP地址、或者处于DOWN状态。很多精简版系统网卡默认没启用,需要自己配置。Ubuntu的netplan配置文件在/etc/netplan/,CentOS的在/etc/sysconfig/network-scripts/ifcfg-ens33,改了配置后记得重启网络服务或者直接重启虚拟机。
4.3 认证失败:密码、用户名和PAM策略
连接通了、服务也在,却卡在输入密码这一步,提示认证失败,这属于第三座大山。
最简单的原因是密码输错了。SSH里的密码是回显不出来的,输入时看着像没反应,其实字符都进去了。确认CapsLock没开,确认输入时用的是英文半角状态。
第二个原因是用户名不对。XShell新建会话时填的用户名,必须和虚拟机里实际存在的用户一致。很多人填写时习惯性填root,但Ubuntu默认安装时并不启用root登录——安装时创建的那个普通用户才是应该填的用户名。root能不能登录还取决于SSH配置里的PermitRootLogin策略,默认在某些发行版里是prohibit-password,禁止root用密码登录。
第三个原因相对隐蔽,多见于CentOS:系统的SELinux或PAM策略限制。遇到这种问题,先用虚拟机图形界面的原生终端登入系统,在本地执行:
passwd给当前用户重新设置一个明确知道的密码,然后再连接。修改密码之后,顺手看一眼SSH配置文件/etc/ssh/sshd_config里PasswordAuthentication的配置,确保是yes。改完配置记得重启服务:
sudo systemctl restart ssh还要提醒一句,别为了省事把PermitRootLogin直接打开,尤其是在能连到外网的机器上。本地虚拟机测试还好,但养成习惯后放到生产环境风险很大。
4.4 主机密钥不匹配:虚拟机重装之后的老问题
如果你以前连过这台虚拟机,后来虚拟机重装或者系统被重置了,再次连接时XShell可能会提示主机密钥发生了变化,拒绝连接。这个是安全机制在起作用——它怀疑这台机器已经不是原来那台了。
解决办法是在会话属性里清除旧的密钥记录。具体入口在XShell的工具、选项或会话属性里找到"主机密钥"相关设置,删除对应主机的记录,重新连接时接受新的主机密钥就行。有些版本会直接弹窗让你选择是接受新密钥还是拒绝,接受即可。
这类提示在真正的生产服务器上要格外谨慎。如果一台服务器没重装系统却突然提示主机密钥变了,大概率是网络被劫持或者机器被人做了手脚,必须通过带外管理方式核实清楚再处置。这也是为什么我建议每次连接新主机时,保存主机密钥的习惯要养成——安全机制只有在被认真对待时才有意义。
5. 把连接体验再拉高一截:密钥登录、XFTP与多会话管理
5.1 用密钥免密登录:一次配置,长期省心
密码登录用久了,最大的问题是麻烦和安全性的平衡。每次都要输密码,还担心密码泄露、被暴力破解。换成密钥登录,两个字:省心。
XShell里自带密钥管理器,在"工具"菜单下找到"用户密钥管理器"。生成一对RSA密钥,长度选2048或4096,生成时可以给私钥加一个保护密码。密钥对生成后,需要把公钥内容加到虚拟机里对应用户的authorized_keys文件中。
在虚拟机终端里执行:
mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys然后用编辑工具打开authorized_keys,把XShell里生成并复制好的公钥内容粘贴进去,保存。
回到XShell会话属性,认证方法选择Public Key,右边选择刚生成的密钥。连接时就不再要密码了。整个过程如果觉得手动粘贴公钥麻烦,XShell的XFTP组件可以把公钥文件直接拖拽到虚拟机里,再在虚拟机里追加到authorized_keys。
这里补充一个常见问题:配完密钥还是要密码。绝大多数原因是~/.ssh目录或authorized_keys文件的权限不对。SSH服务端对权限有严格要求:~/.ssh目录必须是700,authorized_keys必须是600,用户主目录本身不能对其他用户可写。权限错了,SSH会直接忽略这个密钥文件,等于白配。
5.2 Ctrl+Alt+F:在会话里直接调出XFTP传文件
XShell最大的加分项之一是内置XFTP。一个会话连上虚拟机后,快捷键Ctrl+Alt+F可以直接在当前会话对应的服务器上打开一个SFTP文件窗口,和XShell里的终端会话共用同一个连接。拖拽就能上传下载文件,不需要再单独配一个FTP客户端。
对日常管理虚拟机来说,传配置文件、传安装包、拉取日志都特别方便。比如在虚拟机里编辑/etc/nginx/nginx.conf,本地改好了直接拖上去;或者把应用日志拖回来分析,比在终端里cat再复制轻松得多。
XFTP的协议选SFTP,端口默认也是22,和SSH共用,不需要额外开放其他端口,安全上也比FTP明码传输好得多。
5.3 会话管理、快速命令栏和日志记录
机器一多,会话管理就显得重要了。XShell支持把会话按文件夹归类,比如按项目、按环境(测试服务器、预发布、生产)分组。双击一个会话就连接,不用每次重新填IP和账号。连接失败的会话可以标记颜色,状态一目了然。
快速命令栏是个容易忽略的好功能。把高频命令做成按钮放到底部栏,比如查看磁盘占用、查看内存、刷新系统更新、查日志尾部。在XShell的设置里编辑快速命令,输入命令文本,点击就能发给当前会话执行。对经常在几台机器之间重复敲同样命令的人来说,这个功能能省下大量时间。
日志记录功能适合需要留痕的场景。把SSH会话的全过程记录到本地日志文件,包括屏幕输出,对事后复盘、排查问题都有用。入口在XShell的工具、选项里,设置日志文件路径和记录策略,确认开启后,每次会话输出都会写入文件。这个功能我建议一直开着,反正日志文件不大,关键时刻可能救你一命。
5.4 最后分享两个我自己常用的习惯
第一,新开虚拟机后,直接把SSH服务装好、IP固定下来,顺手把XShell会话建好并改名成有意义的名称,别等到要连的时候才手忙脚乱。第二,每次改完sshd_config或防火墙规则,先在虚拟机本机重启服务并验证端口再走人,别让一个简单的配置改动变成两个小时排障的开端。
说回远程连接这件事本身,它就是一套组合拳:网络模式选对,SSH服务在跑,IP地址清晰,XShell会话顺手。把这几个基础环节打牢,你连的就不只是那一台虚拟机,而是拿到了一把适用于任何Linux机器的钥匙。云服务器、家里机房的机器、公司内网的主机,流程一模一样,最多就是IP来源、安全策略略有不同。下次再遇到哪台机器连不上,按本文第4节的链路走一遍,八成能直接定位问题。