圆山中庸 2025-05-10 03:50 采纳率: 98.6%
浏览 6
已采纳

SSH登录Linux时提示“Permission denied (publickey)”如何解决?

在使用SSH登录Linux服务器时,若遇到“Permission denied (publickey)”错误,通常表明公钥认证失败。以下是常见原因及解决方法: 1. **检查权限设置**:确保服务器端的`~/.ssh/authorized_keys`文件权限为600,目录`~/.ssh`权限为700。错误的权限会导致SSH拒绝公钥验证。 2. **确认公钥已添加**:检查客户端公钥(`~/.ssh/id_rsa.pub`)是否正确添加到服务器的`~/.ssh/authorized_keys`文件中。 3. **SSH配置文件**:核实服务器的`/etc/ssh/sshd_config`文件中,以下配置是否正确: - `PubkeyAuthentication yes` - `AuthorizedKeysFile .ssh/authorized_keys` 保存后重启SSH服务:`sudo systemctl restart sshd`。 4. **私钥路径与格式**:确保客户端使用正确的私钥文件,并以PEM或OpenSSH格式存储。 5. **SELinux或防火墙干扰**:如果服务器启用了SELinux或防火墙规则,可能阻止SSH连接,需临时关闭或调整规则测试。 通过以上步骤逐一排查,可有效解决“Permission denied (publickey)”问题。
  • 写回答

1条回答 默认 最新

  • Jiangzhoujiao 2025-05-10 03:50
    关注

    1. 初步排查:权限设置

    当遇到“Permission denied (publickey)”错误时,首先需要检查服务器端的权限设置是否正确。SSH服务对文件和目录的权限要求非常严格,错误的权限设置会导致公钥认证失败。

    • 确保`~/.ssh/authorized_keys`文件权限为600:`chmod 600 ~/.ssh/authorized_keys`。
    • 确保`~/.ssh`目录权限为700:`chmod 700 ~/.ssh`。
    
        chmod 600 ~/.ssh/authorized_keys
        chmod 700 ~/.ssh
        
    如果权限设置不正确,SSH会拒绝使用公钥进行身份验证。

    2. 进一步分析:公钥添加确认

    接下来,需要确认客户端的公钥是否已正确添加到服务器的`~/.ssh/authorized_keys`文件中。

    1. 在客户端生成公钥(如果尚未生成):`ssh-keygen -t rsa`。
    2. 将公钥复制到服务器:`ssh-copy-id user@server`。
    3. 手动检查`~/.ssh/authorized_keys`文件,确保包含正确的公钥内容。
    步骤命令或操作
    1ssh-keygen -t rsa
    2ssh-copy-id user@server
    3cat ~/.ssh/authorized_keys

    3. 深入诊断:SSH配置文件

    检查服务器的SSH配置文件`/etc/ssh/sshd_config`,确保以下关键参数已正确设置:

    • `PubkeyAuthentication yes`
    • `AuthorizedKeysFile .ssh/authorized_keys`

    完成修改后,重启SSH服务以应用更改:

    
        sudo systemctl restart sshd
        
    如果配置文件中的参数不正确,SSH服务将无法启用公钥认证。

    4. 高级问题:私钥路径与格式

    确保客户端使用的是正确的私钥文件,并且私钥存储的格式为PEM或OpenSSH。私钥路径可以通过`-i`选项指定:

    
        ssh -i /path/to/private_key user@server
        

    如果私钥文件损坏或格式不正确,可以尝试重新生成密钥对并重新上传公钥。

    5. 系统级干扰:SELinux与防火墙

    最后,检查服务器上是否启用了SELinux或防火墙规则,这些安全机制可能会阻止SSH连接。

    以下是临时关闭SELinux或调整防火墙规则的方法:

    
        # 临时关闭SELinux
        setenforce 0
    
        # 添加SSH端口到防火墙规则
        sudo firewall-cmd --add-service=ssh --permanent
        sudo firewall-cmd --reload
        
    如果上述方法仍无法解决问题,可以结合日志文件(如`/var/log/secure`)进一步排查。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 5月10日