最近帮人折腾服务器,发现一个现象:Windows 11 用户想连家里的 Ubuntu Server,要么只知道用某个图形化工具,要么拿起命令提示符却不知道怎么下手。其实两条路各有各的适用场景,命令行轻量高效、资源占用小,MobaXterm 这种图形工具则把文件传输、多会话管理做成了可视化操作,适合日常频繁连服务器的人。
这篇文章我把两种方式都完整走一遍,从 Ubuntu Server 端开启 SSH 服务,到 Windows 11 上用命令提示符直连、配置密钥免密登录,再到 MobaXterm 的下载安装、中文设置、图形化连接和文件管理。整个过程不需要你有多深的网络基础,跟着操作就能跑通,中间会穿插一些我实际踩过的坑和排查经验。
1. 连接前必看:Windows 11 环境与 Ubuntu Server 准备
1.1 先想清楚:你到底需要哪种 SSH 连接方式
很多新手一上来就问“哪个工具好”,其实工具本身没有绝对的好坏,关键看你使用场景。我自己的习惯是:临时看个服务状态、改个配置文件,直接 Win+R 输入 cmd 开个命令提示符,几秒就连上了,不占额外资源;但如果是日常管理一台服务器,或者要在本地和服务器之间来回传文件,那命令行模式会把人逼疯,这时候 MobaXterm 的图形化界面优势就非常明显。
还有一点,命令行连接是“最底层”的方式,理解了它,后面用任何 SSH 客户端都能举一反三。MobaXterm 本质上只是封装了 SSH 协议,底层连接逻辑和命令提示符完全一致。所以这篇文章先讲命令提示符,再讲 MobaXterm,顺序是有讲究的。
Windows 11 系统相比旧版本有个好消息:系统自带 OpenSSH 客户端,大部分情况下不用额外安装就能直接使用 ssh 命令。但如果你用的是精简版 Windows 或者安全策略被修改过,可能需要手动启用一下。
1.2 Ubuntu Server 端 3 步开启 SSH 服务
这里我假设你已经装好了 Ubuntu Server,版本以 22.04 LTS 为例。新装好的系统默认不会安装 OpenSSH Server,需要手动装。
第一步,更新软件源并安装 openssh-server。在 Ubuntu Server 的终端里执行:
bash复制sudo apt update
sudo apt install -y openssh-server
安装过程一般几十秒,取决于你的网络速度。装完后 SSH 服务会自动启动,但为了确保开机自启,执行:
bash复制sudo systemctl enable --now ssh
第二步,确认服务状态。执行:
bash复制sudo systemctl status ssh
看到 active (running) 就说明服务正常。如果你看到 inactive 或 failed,多半是安装有问题,重新执行一遍安装命令即可。
第三步,配置防火墙。Ubuntu Server 默认可能启用 UFW,如果开启了,不放行 SSH 端口的话,外面怎么都连不上:
bash复制sudo ufw allow OpenSSH
sudo ufw enable
这里有个细节:很多人执行 ufw enable 时会把当前终端连接也切断,因为默认策略是拒绝所有入站流量。如果你是远程操作服务器,建议在允许 OpenSSH 之后再启用防火墙,或者确认 22 端口放行后再执行。我曾经在机房远程配置服务器时手快开了防火墙忘了放行端口,结果只能让管理员去机房处理,尴尬得很。
1.3 核对 IP 与端口,排除最基本的连接障碍
服务端就绪后,需要拿到服务器的 IP 地址。在 Ubuntu Server 上执行:
bash复制ip a
或者更简洁的方式:
bash复制hostname -I
记下输出的 IPv4 地址,比如 192.168.1.100。确保 Windows 11 和 Ubuntu Server 在同一个局域网内,或者服务器有公网 IP / 配置了端口转发。
在 Windows 11 的命令提示符里先用 ping 测试网络连通性:
cmd复制ping 192.168.1.100
能正常返回就说明网络通。ping 不通的话,先排查防火墙、网段、物理连接,不要急着去看 SSH 的问题。
注意:SSH 默认端口是 22。如果你后面发现连不上,先确认 Ubuntu 上 SSH 服务处于运行状态,再确认 Windows 到服务器的网络路径通不通。
另外,Windows 11 的 OpenSSH 客户端如果没启用,执行 ssh 命令会提示“不是内部或外部命令”。解决办法:设置 -> 系统 -> 可选功能 -> 添加可选功能 -> 搜索 OpenSSH 客户端 -> 安装。或者在 PowerShell 里执行 Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*' 查看状态。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 方法一:命令提示符(CMD)直连与免密登录配置
2.1 第一次用 CMD 连接,验证连通性
服务器准备好后,在 Windows 11 上按 Win+R,输入 cmd,打开命令提示符。
连接命令格式:
cmd复制ssh 用户名@服务器IP
比如用户名是 ubuntu,IP 是 192.168.1.100:
cmd复制ssh ubuntu@192.168.1.100
第一次连接时,系统会提示确认服务器指纹:
text复制The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?
输入 yes 回车。这个提示是 SSH 在帮你确认“你连的确实是那台服务器,而不是有人冒充的”。确认过之后,指纹会记录在 C:\Users\你的用户名\.ssh\known_hosts 文件里,下次连接就不再提示了。
接着输入服务器用户的密码。注意:命令行里输入密码时不会显示任何字符,也不会有星号,这是正常现象,直接输入完整密码后回车即可。
看到类似这样的输出就说明登录成功了:
text复制Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-xxxx x86_64)
Last login: ...
ubuntu@ubuntu-server:~$
现在你就拥有了一台远程服务器的终端控制权,可以执行任何普通用户权限的命令。
2.2 生成 SSH 密钥,省去每次输入密码
密码登录能用,但每次输入密码太麻烦,而且密码安全性也弱于密钥认证。这个步骤我建议所有人做,公钥登录配合私钥,安全性比单纯密码高一个量级,而且以后连接免输密码,效率提升非常明显。
在 Windows 11 的命令提示符里执行:
cmd复制ssh-keygen -t ed25519 -C "windows-ssh"
我推荐使用 ed25519 算法,它的密钥长度更短、安全性更高、生成速度快。如果你要连接的服务器或者某些老旧的网络设备不支持 ed25519,再退而求其次用 rsa -b 4096。
执行后提示保存位置,直接回车使用默认路径 C:\Users\你的用户名\.ssh\id_ed25519 即可。
接着会提示输入 passphrase(口令短语),这个可以留空直接回车,也可以设置一个。留空的好处是以后连接完全无感,坏处是私钥泄露后别人拿到就能用;设置口令短语则每次连接需要额外输入一次。我个人的建议:个人使用电脑且私钥不常复制拷贝,直接留空;公司电脑或者多人共享的电脑,设置一个短口令短语更稳妥。
生成完成后,在命令提示符里用 type 命令查看公钥内容:
cmd复制type %USERPROFILE%\.ssh\id_ed25519.pub
输出是一行以 ssh-ed25519 AAAA... 开头的字符串,这就是要放到服务器上的公钥。
2.3 密钥放上服务器后,连接体验优化
有了公钥,还需要把它放到服务器的 ~/.ssh/authorized_keys 文件里。Windows 没有原生的 ssh-copy-id 命令,有几种方法可以达到目的,我讲一种最直接的方式。
先在 Windows 命令提示符里生成公钥内容,然后复制整行。接着用密码登录服务器,在服务器上执行:
bash复制mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ssh-ed25519 AAAA... 你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
这里有两个权限必须设置到位:.ssh 目录权限必须是 700,authorized_keys 文件权限必须是 600。权限过宽,sshd 出于安全考虑会直接拒绝使用密钥认证。
配置好后退出当前连接:
bash复制exit
然后重新连接:
cmd复制ssh ubuntu@192.168.1.100
这时候如果没有设置 passphrase,直接就能登录,不会再提示输入密码。
如果你之前设置过 passphrase,这里会提示输入。如果连接提示 Permission denied (publickey,password),不要急,先检查公钥是否完整粘贴到 authorized_keys,以及权限是否正确。
注意:
/etc/ssh/sshd_config里如果设置过PubkeyAuthentication no,那密钥认证会被关闭。装完默认是开启的,但如果你之前改过配置要注意。修改后需要重启 SSH 服务才能生效:sudo systemctl restart ssh。
在家目录建一个 config 文件可以进一步简化连接方式。在 Windows 命令提示符里执行:
cmd复制notepad %USERPROFILE%\.ssh\config
写入以下内容:
text复制Host myserver
HostName 192.168.1.100
User ubuntu
IdentityFile ~/.ssh/id_ed25519
保存后,以后连接只需要:
cmd复制ssh myserver
是不是方便多了?多台服务器就用多个配置块,再也不用记 IP、用户名、密钥路径这些零碎信息了。
3. 方法二:MobaXterm 图形化操作与文件管理
3.1 下载、安装和中文设置一次搞定
MobaXterm 是 Windows 平台上非常流行的 SSH 工具,它把 SSH 客户端、SFTP 文件管理、X-server、远程桌面等功能集于一身,一台机器管理几十台服务器都没问题。免费版 Home Edition 对个人使用来说完全够用。
打开官网下载页,找 Home Edition 板块,选择 Portable 版或 Installer 版。Portable 版下载后解压即用,不需要安装,适合不想动系统的朋友;Installer 版会写入注册表,带桌面快捷方式,更新更方便。我习惯用 Portable 版,绿色、干净、重装系统不影响已有会话信息。
首次启动后,界面默认是英文。设置中文的方法:
点击菜单栏的 Settings -> Configuration,在弹出的窗口里切到 General 标签页,找到 Language 下拉框,选择 Chinese (中文),点击 OK。软件会提示重启生效,重启后界面就变成中文了。
MobaXterm 的免费版有一个限制:会话数量超过 12 个时,之前保存的会话会被隐藏,但你删掉一个旧的就能再显示出来。对绝大多数人来说 12 个会话足够用了。
3.2 新建 SSH 会话并保存服务器信息
连接服务器的步骤很简单。点左上角的 Session 图标,在弹出的对话框里选择 SSH 协议类型。
然后填写连接信息:
- 远程主机:服务器的 IP 地址,比如
192.168.1.100 - 指定用户名:比如
ubuntu - 端口:默认 22,不用改
- 会话名称:可以自己起一个,比如“书房 Ubuntu Server”
左下角的“网络连接”一个有用选项是 SSH 隧道(SSH 隧道),后续可以配合端口转发使用。比如你本地用 MySQL 客户端连服务器的数据库,但没有直接开放 3306 端口,就可以先在 MobaXterm 里通过 SSH 隧道转发,实现安全连接。
点击 OK,左侧会话列表里就出现这个会话。双击它,弹出接受服务器指纹的确认框,点“接受”。然后输入密码,点击 OK,进入终端界面。
如果已经配置过密钥认证,可以在会话属性里提前指定私钥:右键会话 -> 编辑会话 -> 高级 SSH 设置 -> 使用私钥,选择之前生成的 id_ed25519 文件。这样双击会话就能直接登录,密码都不用输。
进入 MobaXterm 终端后,操作方式和命令提示符完全一样,毕竟底层都是 SSH 协议。但界面体验好很多:字体可以调、背景色可以换,输出的文字还能选中直接右键复制。
3.3 左侧文件面板、日志保存等日常技巧
MobaXterm 最实用的功能,我个人认为是左侧的远程文件面板。连接成功后,左边会自动展开一个文件树,显示服务器家目录的结构。你可以像操作本地资源管理器一样,直接拖拽文件到本机,或者从本机拖拽上传到服务器,本质是 SFTP 协议。
这个功能对日常运维太方便了:改配置文件前先拖一份到本地备份,传部署包直接拖上去,省去 scp 命令的输入成本。
还有一个容易被忽略的设置:日志保存。点击 Settings -> Configuration -> Terminal 标签页,勾选 记录终端输出,可以设置保存路径和按日期分文件。这样你执行过的命令、返回的输出、报错信息都会被记录下来。出了问题翻日志,比靠记忆复盘强得多。
我自己在生产环境排查故障时,一定会开着日志记录。有一次一个同学在服务器上执行了一串命令,结果服务挂了,他死活想不起自己干了什么。好在 MobaXterm 日志里完整记录了他的操作过程,几分钟就定位到问题:他把 /etc/nginx/ 下某个配置文件的权限改成了 644,重启时 nginx 直接拒绝加载。这种时候日志就是救命稻草。
配色和字号调整:右键终端区域,选 Edit colors / Font,可以按习惯调整。运维人员长时间盯终端,建议把背景设成深色、文字设成浅色,把字体调大一号,比默认的白底黑字舒服很多。
4. 常见问题与排查技巧实录
4.1 Windows 下 SSH 常见的 5 个报错速查
实际连接过程中,下面几个报错出现频率最高,我整理成表格方便对照。
| 报错信息 | 原因 | 解决办法 |
|---|---|---|
Could not create directory '/c/users/\.../.ssh' |
在 Git Bash 等工具里使用 ssh,且 Windows 用户名含中文时,路径解析出错 | 转到 CMD/PowerShell 或 MobaXterm 终端里执行;或手动设置 HOME 环境变量 |
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED |
服务器重装后 SSH 指纹变了,本机 known_hosts 里还是旧指纹 | 执行 ssh-keygen -R 服务器IP 清除旧记录 |
Connection refused |
SSH 服务没启动,或防火墙拦截 22 端口 | 登录服务器确认 systemctl status ssh;检查 sudo ufw status |
Connection timed out |
IP 不对、不在同一网段、防火墙丢弃了数据包 | ping 服务器确认网络;检查 IP 和路由 |
Permission denied (publickey,password) |
密码错误、SSH 配置禁用密码登录、或公钥认证未配置正确 | 确认用户名密码;检查 sshd_config;检查 authorized_keys 权限 |
第一种情况我在中文版 Windows 上遇到不少次,原因在于 ssh 命令在 Cygwin 环境下会把 Windows 用户路径转换成 /c/users/xx/... 格式,如果用户名是中文,路径里出现乱码就报错。解决办法很简单:不要用 Git Bash 跑 ssh,改用 Windows 自带的命令提示符或 PowerShell;或者下载 MobaXterm 直接用内置终端。
对于 REMOTE HOST IDENTIFICATION HAS CHANGED,这是最常见的坑之一。如果你重装了 Ubuntu Server,SSH 服务会生成新的主机密钥,旧密钥还留在 Windows 的 known_hosts 里,SSH 客户端为了防中间人攻击会拒绝连接。此时执行:
cmd复制ssh-keygen -R 192.168.1.100
然后重新连接,接受新指纹即可。
4.2 权限问题:Ubuntu 端 authorized_keys 权限导致的免密失败
免密登录配置好后,如果连接时还是提示输入密码,或者直接 Permission denied,九成是权限问题。
Ubuntu 端对密钥认证相关的文件权限要求很严:
- 用户家目录权限不能是 777,一般 755 或 700 都可以
.ssh目录权限必须是 700authorized_keys文件权限必须是 600
排查时在服务器上执行:
bash复制ls -la ~ | grep -E '^d.*\.ssh'
ls -la ~/.ssh
看到权限不对就修正:
bash复制chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 755 ~
还有一个隐藏问题:如果你是用 root 权限创建的 authorized_keys,文件属主会是 root,普通用户登录时读取权限也会受影响。确认属主:
bash复制ls -l ~/.ssh/authorized_keys
如果属主不是当前用户,改成 chown 用户名:用户名 ~/.ssh/authorized_keys。
4.3 其他值得注意的坑
默认 shell 的问题。如果 Ubuntu Server 默认用户用的是 sh 而不是 bash,SSH 连接上去后操作体验会很别扭:没有自动补全、没有彩色提示符。可以在服务器端执行 sudo usermod -s /bin/bash 用户名 切换。
另一个常见问题是 SSH 连接卡在输入密码后很久才进入界面,多半是 DNS 反向解析导致的延迟。在 /etc/ssh/sshd_config 里加一行 UseDNS no,然后重启 SSH 服务能显著提速。这个优化对局域网环境尤其明显,实测能省掉 5-10 秒的等待时间。
还有 OpenSSH 版本兼容问题。如果你看到 Unable to negotiate with ... no matching key exchange method,是因为新版 OpenSSH 默认禁用了一些弱加密算法,而服务器端还停留在旧版本。解决办法是升级服务器端的 SSH:sudo apt update && sudo apt upgrade openssh-server。一般不建议在客户端强行启用旧算法,毕竟安全更重要。
最近有朋友问 VSCode 远程 SSH 连接不上怎么排查,其实思路和命令提示符一样:先在 CMD 里手动执行 ssh 命令,看能不能正常连。CMD 能连但 VSCode 不行,多半是配置文件路径不对或者私钥路径写错了。VSCode 的 Remote-SSH 扩展读取的是 C:\Users\用户名\.ssh\config,把 SSH Host 配置写到那里基本就能解决。
写在最后的个人建议
如果你只是想在 Windows 11 上偶尔连一次 Ubuntu Server,用命令提示符完全足够,不用折腾任何工具。但要长期管理服务器,我建议把 MobaXterm 用熟,它省下的时间会体现在每一次文件传输和会话切换上。
我个人的操作模式是:先花十分钟把 Ubuntu 端的 SSH 服务和密钥认证配置好,Windows 端生成好密钥,然后分别在 CMD 和 MobaXterm 里各连接一遍。这样测试能确认两条链路都正常,之后日常使用就随心所欲了。想快速敲几个命令的时候开命令提示符,需要管理文件、多台服务器切换、留存操作日志的时候打开 MobaXterm。
配置过程中的一个细节分享一下:/etc/ssh/sshd_config 里有一个参数叫 PermitRootLogin,默认是 prohibit-password,意思是 root 用户只能用密钥登录。如果你想在刚装完系统时直接以 root 身份操作,在服务器上执行 sudo passwd root 设置密码后,把它改成 yes 重启 SSH 即可。但从安全角度,我建议日常使用普通用户登录,需要管理员权限时用 sudo,避免 root 直接暴露在外网。
折腾完这两条链路,你基本就掌握了 SSH 连接的核心思路。后续不管是多加一台服务器、配置端口转发还是用 VSCode 远程开发,展开的套路都是从这套基础来的。
