1. 前言
日常运维或开发中,经常需要从 Windows 电脑通过 SSH 登录多台 Linux 服务器。每次输入密码既繁琐又容易出错,配置 SSH 密钥免密登录后,一条 ssh 别名 即可直达目标主机,配合 ~/.ssh/config 还能为每台机器设置独立别名、端口、用户和密钥。
本文从零开始,完整演示在 Windows 上生成密钥、分发公钥、配置多主机别名,以及常见问题排查。
2. 环境与前置条件
- 客户端:Windows 10 / Windows 11(自带 OpenSSH Client)
- 服务端:任意主流 Linux 发行版(CentOS、Ubuntu、Debian 等),已开启 SSH 服务
- 网络:Windows 能通过 IP 或域名访问 Linux 的 22 端口(或自定义端口)
先确认 Windows 已安装 OpenSSH 客户端。打开 PowerShell:
ssh -V
若输出类似 OpenSSH_for_Windows_9.5p1 则说明已安装。若提示找不到命令,用管理员权限的 PowerShell 安装:
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
3. 在 Windows 上生成 SSH 密钥对
使用 ssh-keygen 生成密钥对,推荐 ed25519 算法(更短更安全),也可用 RSA:
# 推荐:ed25519
ssh-keygen -t ed25519 -C "windows-pc"
# 兼容老系统:RSA 4096
ssh-keygen -t rsa -b 4096 -C "windows-pc"
执行过程中会提示保存路径,直接回车使用默认路径:
C:\Users\<你的用户名>\.ssh\id_ed25519
随后提示设置 passphrase(密钥口令),可直接回车留空实现完全免密;若设置了口令,可通过 ssh-agent 缓存避免每次输入。
生成完成后目录结构如下:
C:\Users\<用户名>\.ssh\
├── id_ed25519 # 私钥,务必保密
└── id_ed25519.pub # 公钥,分发给服务器
4. 将公钥分发到多台 Linux 主机
4.1 方式一:ssh-copy-id(推荐,需 Linux 侧支持)
Windows 自带的 OpenSSH 通常不带 ssh-copy-id,可在 PowerShell 中用一行命令替代:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh root@192.168.1.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
对每台主机重复执行,只需替换 IP 和用户名:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh root@192.168.1.11 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh root@192.168.1.12 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
4.2 方式二:手动复制
- 用记事本打开
C:\Users\<用户名>\.ssh\id_ed25519.pub,复制全部内容; - 登录目标 Linux,执行:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "粘贴的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
4.3 方式三:批量分发脚本
主机较多时,写一个 PowerShell 脚本循环处理:
$hosts = @(
@{ Ip = "192.168.1.10"; User = "root" },
@{ Ip = "192.168.1.11"; User = "root" },
@{ Ip = "192.168.1.12"; User = "root" }
)
$pubKey = Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub"
foreach ($h in $hosts) {
Write-Host "分发公钥到 $($h.User)@$($h.Ip) ..."
$cmd = "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo '$pubKey' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
ssh "$($h.User)@$($h.Ip)" $cmd
}
5. 配置多主机别名(~/.ssh/config)
在 C:\Users\<用户名>\.ssh\ 下新建文件 config(无扩展名),内容示例:
# 全局默认
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
TCPKeepAlive yes
# 主机一:Web 服务器
Host web1
HostName 192.168.1.10
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
# 主机二:数据库服务器
Host db1
HostName 192.168.1.11
User dba
Port 2222
IdentityFile ~/.ssh/id_ed25519
# 主机三:测试环境
Host test1
HostName 192.168.1.12
User deploy
Port 22
IdentityFile ~/.ssh/id_ed25519
配置完成后即可用别名登录:
ssh web1
ssh db1
ssh test1
注意:Windows 下
IdentityFile建议写~/.ssh/id_ed25519,OpenSSH 会自动展开为用户目录;若使用绝对路径,注意反斜杠需转义或改用正斜杠。
6. 使用 ssh-agent 管理带口令的密钥
如果生成密钥时设置了 passphrase,可通过 Windows 的 ssh-agent 服务缓存密钥,实现一次输入、长期免密。
以管理员身份打开 PowerShell:
# 设置 ssh-agent 服务为自动启动并启动
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
# 添加私钥(会提示输入一次 passphrase)
ssh-add $env:USERPROFILE\.ssh\id_ed25519
# 查看已加载的密钥
ssh-add -l
之后登录任意主机都不再提示输入口令。
7. 验证与常见问题排查
7.1 验证免密登录
ssh -v web1
-v 会输出详细握手过程,看到 Authentication succeeded (publickey) 即表示免密成功。
7.2 常见问题
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 仍提示输入密码 | 公钥未写入或权限不对 | 检查 ~/.ssh/authorized_keys 内容与权限 600 |
Permission denied (publickey) | 服务端禁用了公钥认证 | 修改 /etc/ssh/sshd_config 中 PubkeyAuthentication yes 并重启 sshd |
Bad owner or permissions | Windows 上私钥/配置文件权限过宽 | 右键文件 → 属性 → 安全,仅保留当前用户 |
| 连接超时 | 防火墙或端口不通 | 检查 firewall-cmd/ufw 及云服务器安全组 |
| 登录后立即断开 | 服务端 AllowUsers 限制 | 在 sshd_config 中加入对应用户 |
服务端关键配置参考:
# /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no # 确认免密可用后再关闭密码登录
修改后重启服务:
sudo systemctl restart sshd
8. 安全建议
- 私钥文件
id_ed25519绝不外传,不要提交到 Git 仓库; - 生产环境建议为不同用途生成不同密钥,并在
config中按主机指定IdentityFile; - 确认免密登录可用后,再关闭服务端密码登录,降低暴力破解风险;
- 定期轮换密钥,离职或设备更换时及时从各主机
authorized_keys中移除旧公钥; - 可结合
Fail2ban、限制登录 IP 等手段进一步加固。 - 每个不同的主机可以生成不同的密钥,密钥存放不同的文件,在config文件引用
9. 总结
整体流程可以概括为:生成密钥 → 分发公钥 → 配置别名 → 验证登录。
配置完成后,多台 Linux 主机只需 ssh web1、ssh db1 这样一条命令即可登录,日常运维效率显著提升。
1811



被折叠的 条评论
为什么被折叠?



