跳到主要内容
外观
外观设置
显示模式
主题配色

保存在此浏览器,所有页面通用。

Windows PowerShell 配置 SSH 密钥登录 Linux 主机

0 次浏览0 次点赞

在 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 认证设置前应保留已有会话,并在新窗口测试,避免把自己锁在服务器之外。