把密码登录换成了密钥,结果新密钥也连不上,提示 Permission denied (publickey)。密钥本身没问题,多半是文件权限或服务端开关。
权限必须收紧
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 700 ~ restorecon -R ~/.ssh
SSH 对权限非常敏感,家目录或 .ssh 允许其他人写入时会直接忽略公钥。最后一条是 CentOS 上 SELinux 的上下文修复,缺了它文件权限对也登不上。
确认服务端允许公钥认证
grep -E "PubkeyAuthentication|AuthorizedKeysFile" \ /etc/ssh/sshd_config sshd -t && systemctl reload sshd
PubkeyAuthentication 必须是 yes,AuthorizedKeysFile 指向的路径要和实际文件一致。某些发行版的配置分片放在 sshd_config.d 目录,改主文件会被覆盖。
用详细模式看握手过程
ssh -vvv 用户名@服务器IP 2>&1 | grep -i "publickey\|offering"
看客户端有没有真的把密钥发出去。只试了密码就结束,说明本地配置里没指定这个文件,或者 agent 里加载的是另一把。
改配置前务必保留一个已登录的会话,避免改错之后彻底进不去。
云服务器还有一种情况
平台提供了密钥对绑定功能,绑定后会替换实例内的公钥。自己手动往文件里加的密钥,可能在重启或重置密码时被平台覆盖。用控制台绑定密钥对,比手工编辑更稳。
另外检查登录用户名,Ubuntu 默认是 ubuntu 而不是 root,密钥对同一把,用户名错了同样报 publickey 失败。
如果所有配置都对仍不通,用云厂商的远程连接功能登进去看 auth.log,日志会明确写出拒绝原因和尝试过的公钥指纹。