🔧 背景说明
在 Windows 系统中配置 SSH 免密登录时,由于系统对文件权限、路径命名和配置格式的特殊要求,用户常会遇到以下问题:
- ssh-copy-id 命令不可用
- 出现 Permission denied 错误
- 公钥复制后仍无法登录
- authorized_keys 文件未生效
- 修改 sshd_config 需要管理员权限
本文将详细介绍完整解决方案,提供 PowerShell/Git Bash 命令,助您快速实现免密登录。
✅ 第一步:生成 SSH 密钥对(客户端操作)
在本地电脑执行(推荐使用 Git Bash 或 WSL):
ssh-keygen -t rsa -b 4096密钥默认保存路径:C:\Users\[用户名]\.ssh\
- 私钥:id_rsa(需严格保密)
- 公钥:id_rsa.pub(用于分享)
💡 提示:直接回车跳过 passphrase 设置(除非需要额外安全保护)
📤 第二步:部署公钥到目标服务器
❌ 问题 1:Windows 缺少 ssh-copy-id
✅ 解决方案:使用 Git Bash(下载地址)
ssh-copy-id lenovo@192.168.3.23⚠️ 注意:需要输入目标电脑上 lenovo 用户的真实密码(非 PIN 码)
❌ 问题 2:无法自动部署公钥
✅ 手动部署方案:
- 获取本地公钥:
cat ~/.ssh/id_rsa.pub复制输出的 ssh-rsa 开头的公钥内容
- 在目标服务器创建 authorized_keys:
mkdir C:\Users\lenovo\.ssh notepad C:\Users\lenovo\.ssh\authorized_keys- 确保文件名准确:
- 显示文件扩展名(资源管理器 → 查看 → 勾选"文件扩展名")
- 确认文件名为 authorized_keys(无.txt 后缀)
⚙️ 第三步:配置 SSH 服务端(目标电脑)
❌ 问题 3:sshd_config 配置未启用
✅ 配置步骤(需管理员权限):
- 管理员身份运行 PowerShell
- 编辑配置文件:
notepad C:\ProgramData\ssh\sshd_config- 取消注释以下配置:
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys- (可选)禁用密码登录:
PasswordAuthentication no- 保存并重启服务:
Restart-Service sshd💡 如遇保存问题,先执行:
takeown /f "C:\ProgramData\ssh\sshd_config" icacls "C:\ProgramData\ssh\sshd_config" /grant administrators:F🔒 第四步:设置文件权限(Windows 关键步骤)
✅ 管理员身份执行:
# 设置 .ssh 目录权限 icacls "C:\Users\lenovo\.ssh" /inheritance:r icacls "C:\Users\lenovo\.ssh" /grant:r "SYSTEM:(F)" icacls "C:\Users\lenovo\.ssh" /grant:r "Administrators:(F)" icacls "C:\Users\lenovo\.ssh" /grant:r "lenovo:(F)" # 设置 authorized_keys 权限 icacls "C:\Users\lenovo\.ssh\authorized_keys" /inheritance:r icacls "C:\Users\lenovo\.ssh\authorized_keys" /grant:r "SYSTEM:(R)" icacls "C:\Users\lenovo\.ssh\authorized_keys" /grant:r "Administrators:(R)" icacls "C:\Users\lenovo\.ssh\authorized_keys" /grant:r "lenovo:(R)"✅ 此步骤可解决 80% 的权限问题!
🧪 第五步:测试连接
在本地终端执行:
ssh lenovo@192.168.3.23成功标志:直接进入命令行 失败排查:使用调试模式
ssh -v lenovo@192.168.3.23🚫 常见错误及解决方案
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
| Permission denied | 公钥未部署/权限错误 | 检查 authorized_keys 及权限 |
| ssh-copy-id: command not found | Windows 默认不支持 | 使用 Git Bash |
| authorized_keys 不生效 | 文件扩展名问题 | 确保无.txt 后缀 |
| 无法修改 sshd_config | 权限不足 | 管理员身份运行 |
📌 检查清单
✅ 客户端:
- 已生成密钥对
- 使用 Git Bash 部署公钥
✅ 服务器端:
- authorized_keys 存在且内容正确
- 文件名无.txt 后缀
- sshd_config 启用公钥认证
- 权限设置正确
- 服务已重启
🎁 附:一键修复脚本(服务器端)
保存为 fix-ssh.ps1,管理员身份运行:
$User = "lenovo" $SshDir = "C:\Users\$User\.ssh" # 创建目录 if (!(Test-Path $SshDir)) { mkdir $SshDir } # 设置权限 icacls $SshDir /inheritance:r icacls $SshDir /grant:r "SYSTEM:(F)" icacls $SshDir /grant:r "Administrators:(F)" icacls $SshDir /grant:r "$User:(F)" if (Test-Path "$SshDir\authorized_keys") { icacls "$SshDir\authorized_keys" /inheritance:r icacls "$SshDir\authorized_keys" /grant:r "SYSTEM:(R)" icacls "$SshDir\authorized_keys" /grant:r "Administrators:(R)" icacls "$SshDir\authorized_keys" /grant:r "$User:(R)" } # 提示配置检查 Write-Host "请确认 C:\ProgramData\ssh\sshd_config 包含:" Write-Host "PubkeyAuthentication yes" Write-Host "AuthorizedKeysFile .ssh/authorized_keys" # 重启服务 Restart-Service sshd Write-Host "SSH 服务已重启!"