本文记录如何在 Windows 10/11 上使用 OpenSSH,通过密钥免密登录 Ubuntu 服务器。
文中统一使用192.0.2.10作为服务器示例地址。该地址属于文档示例专用地址,实际操作时应替换为自己的服务器 IP。
一、准备条件
开始之前,需要具备:
- 一台 Windows 10 或 Windows 11 电脑;
- 一台可以通过 SSH 访问的 Ubuntu 服务器;
- Ubuntu 服务器的用户名和密码,或其他可用的初始登录方式;
- 服务器 SSH 端口,本文假设为默认端口
22。
本文示例信息如下:
服务器地址:192.0.2.10 登录用户名:ubuntu SSH 端口:22 快捷名称:ubuntu-server二、确认 Windows 已安装 OpenSSH
打开 PowerShell,执行:
ssh-V如果输出中包含OpenSSH_for_Windows,说明 SSH 客户端已经安装,可以继续下一步。
如果提示无法识别ssh命令,以管理员身份打开 PowerShell,然后执行:
Add-WindowsCapability-Online-Name OpenSSH.Client~~~~0.0.1.0安装完成后,关闭并重新打开 PowerShell。
三、检查服务器端口是否可访问
执行:
Test-NetConnection192.0.2.10-Port 22如果结果中出现以下内容,说明网络和 SSH 端口基本正常:
TcpTestSucceeded : True如果结果为False,应检查:
- 服务器地址是否正确;
- SSH 端口是否为
22; - 服务器和云平台防火墙是否允许该端口;
- Ubuntu 上的 SSH 服务是否已经启动;
- 当前网络能否访问服务器。
四、先测试密码登录
执行:
ssh ubuntu@192.0.2.10第一次连接时,SSH 可能显示服务器公钥指纹并询问是否继续:
Are you sure you want to continue connecting (yes/no/[fingerprint])?应先确认显示的服务器指纹可信。确认后输入:
yes随后输入 Ubuntu 上ubuntu用户的密码。输入密码时屏幕不会显示字符,这是正常现象。
登录成功后执行以下命令退出服务器:
exit如果无法完成密码登录,需要先解决用户名、密码、端口或服务器 SSH 配置问题,再继续安装公钥。
五、生成 SSH 密钥
为了避免覆盖电脑上已有的默认密钥,这里为目标服务器创建一套单独的 Ed25519 密钥:
ssh-keygen-t ed25519-f"$env:USERPROFILE\.ssh\id_ed25519_ubuntu_server"-C"$env:USERNAME@$env:COMPUTERNAME"随后会询问是否设置私钥口令:
Enter passphrase (empty for no passphrase):- 如果希望整个连接过程完全无提示,连续按两次回车,使用空口令;
- 如果电脑可能被他人使用,建议设置私钥口令,并结合
ssh-agent使用,以提高私钥安全性。
命令会生成两个文件:
私钥:%USERPROFILE%\.ssh\id_ed25519_ubuntu_server 公钥:%USERPROFILE%\.ssh\id_ed25519_ubuntu_server.pub私钥必须妥善保管,不能发送给他人,也不能复制到服务器。需要安装到服务器的是以.pub结尾的公钥。
六、将公钥安装到 Ubuntu 服务器
在 PowerShell 中执行:
Get-Content"$env:USERPROFILE\.ssh\id_ed25519_ubuntu_server.pub"|ssh ubuntu@192.0.2.10'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys; chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys'根据提示输入一次ubuntu用户的服务器密码。该命令会:
- 创建服务器端的
~/.ssh目录; - 将 Windows 公钥追加到
~/.ssh/authorized_keys; - 设置 OpenSSH 所要求的目录和文件权限。
七、测试密钥登录
明确指定刚生成的私钥进行测试:
ssh-i"$env:USERPROFILE\.ssh\id_ed25519_ubuntu_server"-o IdentitiesOnly=yes ubuntu@192.0.2.10如果能够直接进入服务器,并且没有要求输入 Ubuntu 用户密码,说明免密登录已经配置成功。
这里的“免密”是指不再输入 Ubuntu 账户密码。如果生成密钥时设置了私钥口令,SSH 仍可能要求输入该口令。
八、配置 SSH 快捷名称
为了避免每次输入服务器地址、用户名和私钥路径,可以编辑 Windows SSH 配置文件:
notepad"$env:USERPROFILE\.ssh\config"如果文件不存在,记事本会询问是否创建。写入以下内容:
Host ubuntu-server HostName 192.0.2.10 User ubuntu Port 22 IdentityFile ~/.ssh/id_ed25519_ubuntu_server IdentitiesOnly yes保存后,可以使用快捷名称登录:
ssh ubuntu-server也可以通过快捷名称复制文件。例如,将本地的example.txt上传到 Ubuntu 用户的主目录:
scp.\example.txt ubuntu-server:~/九、非默认 SSH 端口
如果服务器使用端口2222,测试连接时应执行:
ssh-p 2222 ubuntu@192.0.2.10安装公钥时也需要指定端口:
Get-Content"$env:USERPROFILE\.ssh\id_ed25519_ubuntu_server.pub"|ssh-p 2222 ubuntu@192.0.2.10'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys; chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys'SSH 配置则修改为:
Host ubuntu-server HostName 192.0.2.10 User ubuntu Port 2222 IdentityFile ~/.ssh/id_ed25519_ubuntu_server IdentitiesOnly yes十、常见问题排查
1. 提示Permission denied (publickey)
常见原因包括:
- 公钥没有正确写入
~/.ssh/authorized_keys; - 登录用户名错误;
- 指定了错误的私钥;
- 服务器端 SSH 服务禁止公钥认证;
- Ubuntu 用户主目录或
.ssh目录权限不正确。
如果仍能通过密码或服务器控制台登录,可以在 Ubuntu 上执行:
mkdir-p~/.sshchmod700~/.sshchmod600~/.ssh/authorized_keyschown-R"$(id-un):$(id-gn)"~/.ssh然后在 Windows 上开启详细日志重新连接:
ssh-vvv ubuntu-server重点查看客户端是否加载了正确的私钥,以及服务器是否接受对应公钥。
2. 提示Connection timed out
这通常是网络、路由或防火墙问题。重新检查端口:
Test-NetConnection192.0.2.10-Port 223. 提示Connection refused
这通常意味着目标地址可以访问,但对应端口没有 SSH 服务监听。需要检查 SSH 端口,并在 Ubuntu 服务器上检查服务状态:
sudosystemctl statusssh4. 提示服务器主机密钥发生变化
如果出现REMOTE HOST IDENTIFICATION HAS CHANGED,不要直接忽略或盲目删除记录。应先通过服务器控制台或管理员确认服务器是否重装、IP 是否被重新分配,并核对新的主机密钥指纹,避免遭遇中间人攻击。
5. 仍然要求输入 Ubuntu 用户密码
可以显式指定私钥排除配置问题:
ssh-i"$env:USERPROFILE\.ssh\id_ed25519_ubuntu_server"-o IdentitiesOnly=yes ubuntu@192.0.2.10如果该命令可以免密登录,说明问题通常位于%USERPROFILE%\.ssh\config,需要检查Host、HostName和IdentityFile。