遇到 SSH 连接提示 Permission denied (publickey) 时,最直接的排查方向是检查本地私钥权限是否正确,以及服务器是否认可你提供的公钥。
先说结论:该报错通常意味着服务器拒绝了你的密钥认证请求,优先检查本地密钥文件权限和服务器端授权配置。
- 先确认:本地私钥文件权限是否为 600,且所有权属于当前用户。
- 先处理:使用 ssh -v 查看调试信息,定位是密钥未发送还是服务器拒绝。
- 再验证:修正权限或配置后,尝试重新连接并观察认证流程是否通过。
命令速用版
如果你希望快速尝试修复,可以按顺序执行以下命令:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
ssh -v user@host注意:上述命令假设你使用的是默认的 id_rsa 密钥,如果是 ed25519 请相应调整文件名。
为什么会这样
SSH 公钥认证依赖严格的文件权限控制。出于安全考虑,SSH 服务端会检查客户端私钥权限是否过于开放,同时也会检查服务器端 ~/.ssh 目录和 authorized_keys 文件的权限。如果权限设置不当,服务端会静默忽略密钥或直接拒绝连接,从而报出 Permission denied (publickey)。
此外,服务端配置文件 /etc/ssh/sshd_config 中的 PubkeyAuthentication 选项如果被设置为 no,或者允许认证的用户列表不匹配,也会导致此问题。
分步处理
1. 检查本地密钥权限
在本地终端执行:
ls -l ~/.ssh/id_rsa权限应为 -rw------- (600)。如果权限过大,执行:
chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh2. 查看详细连接日志
使用 -v 参数输出调试信息,观察密钥是否被加载:
ssh -v user@host查找输出中是否有 Offering public key 字样,以及服务器返回的具体拒绝原因。
3. 检查服务器端配置
如果你能通过其他方式(如密码或控制台)登录服务器,检查 ~/.ssh/authorized_keys 文件权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R $USER:$USER ~/.ssh同时确认 /etc/ssh/sshd_config 中包含:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys修改配置后需重启 sshd 服务。
怎么验证是否生效
再次执行 ssh 连接命令,不再出现 Permission denied 报错,且无需输入密码即可进入系统。
若仍使用 -v 参数,观察日志末尾应显示 Authentication succeeded 或 Similar success message,而非 Permission denied。
也可以查看服务器端日志,Linux 通常在 /var/log/secure 或 /var/log/auth.log,确认是否有 Accepted publickey 记录。
常见坑
- SELinux 限制:在某些发行版中,SELinux 上下文错误会阻止 sshd 读取密钥文件,需检查 restorecon 设置。
- Windows 换行符:如果在 Windows 编辑过 authorized_keys 文件,可能引入 CRLF 换行符导致密钥失效,需转换为 LF。
- 用户不匹配:确保登录命令中的用户名与服务器上 authorized_keys 所属用户一致,root 用户可能受 PermitRootLogin 限制。
- 密钥类型:较新的 OpenSSH 版本默认优先使用 ed25519,若服务器仅支持 RSA 需指定 -i 参数或调整算法配置。