Windows PowerShell 配置 SSH 密钥登录 Linux 主机
本文目录
在 Windows 的 PowerShell 中,可以使用 OpenSSH 密钥登录 Linux 主机,无需每次输入 Linux 用户密码。本文介绍如何生成密钥、将公钥添加到 Linux,以及使用 ssh-agent 减少私钥密码的重复输入。
一、准备工作
本文适用于安装了 OpenSSH 客户端的 Windows 10、Windows 11,以及运行 OpenSSH 服务端的 Linux 主机。操作前请准备好:
- Linux 主机的 IP 地址或域名、SSH 端口和登录用户名。
- 首次配置时可用的登录方式,例如 SSH 密码登录,或云服务器的控制台。
- Linux 主机上的目标用户账号。公钥需要添加到该用户自己的账户目录中。
本文以 Linux 用户名 ubuntu、主机地址 192.168.1.100、SSH 端口 22 为例。使用时请替换为实际信息。
以下命令分别标明了执行位置:Windows PowerShell 或 Linux 终端。普通步骤无需以管理员身份运行 PowerShell。
二、检查 Windows OpenSSH 客户端
打开 PowerShell,执行:
ssh -V
如果显示 OpenSSH 版本号,说明客户端可用。如果提示找不到命令,可以在 Windows“设置”的“可选功能”中查找并安装“OpenSSH 客户端”。安装后重新打开 PowerShell,再次检查。
Windows OpenSSH 的相关工具包括 ssh、ssh-keygen、ssh-agent 和 ssh-add。详情参见 Microsoft OpenSSH 概述。
三、在 Windows 生成 SSH 密钥
在 Windows PowerShell 中执行:
ssh-keygen -t ed25519 -C "windows-linux"
出现保存路径提示时,直接按回车,使用默认路径:
C:\Users\你的Windows用户名\.ssh\id_ed25519
如果提示文件已存在,不要直接确认覆盖。已有密钥可能正在用于其他主机;可以继续使用已有密钥,或重新执行命令并指定新的文件名。
接下来设置私钥密码(passphrase)。输入时屏幕不会显示字符,这是正常现象;输入两次后完成生成。建议设置密码,以降低私钥文件泄露后的风险。
生成后有两个文件:
id_ed25519:私钥,保存在 Windows 本机,不要发送给他人或上传到 Linux。id_ed25519.pub:公钥,需要添加到 Linux 目标用户的授权文件。
私钥密码用于保护本地私钥,与 Linux 用户的登录密码是两个不同的密码。密钥登录不再需要输入 Linux 用户密码,但如果私钥设置了密码,仍可能需要输入私钥密码。
密钥生成和私钥保护说明可参见 Microsoft:OpenSSH 密钥身份验证。
四、将公钥添加到 Linux
1. 复制 Windows 上的公钥
在 Windows PowerShell 中执行:
Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub"
复制输出的完整一行,通常以 ssh-ed25519 开头。不要复制没有 .pub 后缀的私钥文件。
2. 登录 Linux
在 Windows PowerShell 中执行:
ssh ubuntu@192.168.1.100
首次连接时,SSH 会显示服务器主机密钥指纹。请先通过云平台控制台或其他可信渠道核对指纹,再确认连接。随后使用 Linux 用户密码登录。
如果 SSH 使用非默认端口,例如 2222,使用:
ssh -p 2222 ubuntu@192.168.1.100
如果服务器已经禁用密码登录,请通过云服务器控制台或其他已有的管理方式登录 Linux,再执行下面的步骤。
3. 添加公钥
确认当前登录的是需要使用密钥登录的 Linux 用户,然后在 Linux 终端执行:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
nano ~/.ssh/authorized_keys
将刚才复制的公钥完整粘贴到文件末尾,单独占一行。保留已有公钥,不要删除或覆盖其他内容。按 Ctrl+O、回车保存,再按 Ctrl+X 退出。
如果系统没有安装 nano,可以使用其他文本编辑器。authorized_keys 是 OpenSSH 默认使用的公钥授权文件之一;服务器如果修改了 AuthorizedKeysFile,应按实际配置操作。参见 OpenSSH sshd_config 文档。
五、测试密钥登录
保留当前 Linux 会话,另开一个 Windows PowerShell 窗口执行:
ssh -i "$env:USERPROFILE\.ssh\id_ed25519" ubuntu@192.168.1.100
如果设置了私钥密码,可能会出现 Enter passphrase for key 提示。输入的是生成密钥时设置的私钥密码,不是 Linux 用户密码。
成功进入 Linux 后,说明公钥认证已生效。如果仍提示输入 Linux 用户密码,说明本次连接可能回退到了密码认证,可查看下方的排查步骤。
默认文件名 id_ed25519 通常可以被 SSH 自动识别。确认可用后,也可以直接连接:
ssh ubuntu@192.168.1.100
六、使用 ssh-agent 保存私钥
如果私钥设置了密码,可以使用 Windows 的 ssh-agent 保存私钥,减少重复输入。以下步骤在 Windows 上执行。
先以管理员身份打开 PowerShell,启用并启动服务:
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent
确认状态为 Running 后,使用日常登录的 Windows 账户打开 PowerShell,添加私钥:
ssh-add "$env:USERPROFILE\.ssh\id_ed25519"
按提示输入私钥密码。然后检查已添加的密钥:
ssh-add -l
之后再次连接时,SSH 客户端可以使用代理中的密钥。Windows OpenSSH 的代理可能跨会话保存已添加的密钥,请保护好 Windows 账户及电脑,并妥善备份原始私钥。使用完毕如需从代理中移除该密钥,可以执行:
ssh-add -d "$env:USERPROFILE\.ssh\id_ed25519"
相关说明参见 Microsoft 密钥管理文档及 Windows OpenSSH 客户端故障排查。
七、为常用主机设置快捷连接
如果经常连接同一台主机,可以在 Windows PowerShell 中打开 SSH 配置文件:
notepad "$env:USERPROFILE\.ssh\config"
如果文件不存在,可以在记事本提示时创建。添加以下内容,并替换地址、端口和用户名:
Host my-linux
HostName 192.168.1.100
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
保存后,在 PowerShell 中执行:
ssh my-linux
其中 my-linux 是自定义的连接别名;如果使用其他密钥文件,也要相应修改 IdentityFile。
八、常见问题排查
仍然要求输入 Linux 用户密码
先在 Windows PowerShell 中查看详细连接过程:
ssh -v -i "$env:USERPROFILE\.ssh\id_ed25519" ubuntu@192.168.1.100
重点检查以下内容:
- 用户名是否正确,公钥是否添加到了该用户的
~/.ssh/authorized_keys。 - 公钥是否完整且单独占一行,是否误用了私钥内容。
- Linux 用户主目录及
.ssh、authorized_keys的所有权和权限是否正确;SSH 服务端可能拒绝权限过宽的文件。 - 服务器是否启用了公钥认证,以及是否使用了自定义的授权文件路径或其他认证策略。
在 Linux 上可以查看相关权限:
ls -ld ~ ~/.ssh
ls -l ~/.ssh/authorized_keys
通常,.ssh 目录可设为 700,authorized_keys 可设为 600,并由目标用户拥有。如果之前使用 sudo 创建了这些文件,还应检查所有者是否被错误设置为 root。
OpenSSH 的 PubkeyAuthentication 默认值为 yes,但实际配置可能不同。检查时应同时考虑配置包含文件和 Match 条件;需要修改服务端配置时,先保留现有会话,并按发行版的方式检查配置及重新加载服务。参见 OpenSSH 服务端配置文档。
出现主机密钥变化警告
如果出现 REMOTE HOST IDENTIFICATION HAS CHANGED,不要直接忽略。可能是服务器重装或主机密钥更换,也可能是连接到了错误的主机。先通过可信渠道核对当前服务器指纹,确认原因后再处理本机保存的旧记录。
私钥丢失或泄露
私钥丢失时,可以通过控制台或其他已有登录方式,为该用户添加新的公钥。私钥泄露时,应尽快从所有使用它的主机的 authorized_keys 中删除对应公钥,并生成新的密钥对。
建议:确认密钥登录正常且具备控制台等备用访问方式后,再考虑是否关闭服务器的密码登录。修改 SSH 认证设置前应保留已有会话,并在新窗口测试,避免把自己锁在服务器之外。

