Permission denied (publickey) 表明SSH服务端拒绝公钥认证,主因是服务端未加载或不信任客户端提供的公钥,需依次检查私钥路径、sshd_config配置、~/.ssh及authorized_keys权限与格式、SELinux上下文、authorized_keys内容规范、sshd服务重载状态、端口一致性、私钥完整性及密码输入正确性。
SSH 客户端提示 Permission denied (publickey)
这是最典型的密钥认证失败表现,说明服务端拒绝了你提供的公钥。常见原因不是私钥没发过去,而是服务端压根没加载或不信任它。
检查步骤:
- 确认客户端用的是正确的私钥:
ssh -i /path/to/id_rsa user@host;没加-i时默认只试~/.ssh/id_rsa、id_ecdsa等有限几个名字 - 服务端
/etc/ssh/sshd_config中必须有PubkeyAuthentication yes,且未被注释或覆盖 - 用户家目录(
/home/user)和~/.ssh的权限不能太宽松:目录需700,authorized_keys文件需600;chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys - SELinux 启用时可能拦截访问,临时禁用验证:
sudo setenforce 0;若恢复后仍失败,需修复上下文:restorecon -Rv ~/.ssh
authorized_keys 文件内容格式错误
哪怕只多一个空格、换行或用了 Windows 换行符(\r\n),OpenSSH 都会静默忽略整行公钥。
实操建议:
- 用
ssh-keygen -l -f ~/.ssh/id_rsa.pub确认公钥本身有效 - 追加公钥务必用
ssh-copy-id或手动echo "公钥内容" >> ~/.ssh/authorized_keys,避免复制粘贴引入不可见字符 - 检查文件编码和换行:
file ~/.ssh/authorized_keys应显示ASCII text;cat -A ~/.ssh/authorized_keys查看是否含$(行尾)以外的^M - 每行只能有一把公钥,开头是
ssh-rsa/ecdsa-sha2-nistp256等类型标识,结尾是邮箱或注释(可选),中间不能断行
服务端 SSH 进程未重载配置或监听变更
改完 /etc/ssh/sshd_config 或 authorized_keys 后,很多人忘了让服务生效。