三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

【环境配置】Windows 配置 SSH 免密登录 Ubuntu服务器

【环境配置】Windows 配置 SSH 免密登录 Ubuntu服务器

本文记录如何在 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用户的服务器密码。该命令会:

  1. 创建服务器端的~/.ssh目录;
  2. 将 Windows 公钥追加到~/.ssh/authorized_keys
  3. 设置 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 22

3. 提示Connection refused

这通常意味着目标地址可以访问,但对应端口没有 SSH 服务监听。需要检查 SSH 端口,并在 Ubuntu 服务器上检查服务状态:

sudosystemctl statusssh

4. 提示服务器主机密钥发生变化

如果出现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,需要检查HostHostNameIdentityFile

← 返回列表