遇到这个报错通常是因为 SSH 私钥文件的权限设置过于宽松,最直接的处理是将权限修改为 600 或 400。
先说结论:这是 SSH 客户端的安全保护机制,必须收紧私钥文件权限才能继续使用。
- 先确认:检查报错指向的具体密钥文件路径。
- 先处理:使用 chmod 命令将权限设置为 600。
- 再验证:重新执行 SSH 命令确认报错消失。
命令速用版
假设你的私钥文件是默认的 ~/.ssh/id_rsa,直接在终端执行:
chmod 600 ~/.ssh/id_rsa
如果是其他路径,替换为实际文件路径即可。如果不确定文件归属,顺便修正所有者:
chown $(whoami):$(whoami) ~/.ssh/id_rsa
为什么会这样
SSH 协议在设计时要求私钥必须具备严格的访问控制。如果权限设置为 0644,意味着同组用户或其他用户可能有权读取该文件。一旦私钥泄露,他人即可冒充你的身份登录服务器或访问代码仓库。因此,OpenSSH 客户端在检测到权限过于开放时,会主动拒绝加载该密钥并抛出报错,这是一种强制性的安全拦截。
分步处理
按照以下顺序操作,避免遗漏关联问题:
- 确认文件路径:报错信息通常会明确写出哪个文件权限不对,例如 WARNING: UNPROTECTED PRIVATE KEY FILE! 下方会显示路径。
- 查看当前权限:执行 ls -l <文件路径>,确认当前是否为 644 或更开放。
- 修改权限:执行 chmod 600 <文件路径>。部分严格场景建议使用 chmod 400(只读)。
- 检查目录权限:确保 ~/.ssh 目录权限为 700,执行 chmod 700 ~/.ssh。
- 检查所有者:确保文件属于当前用户,非 root 或其他用户。
怎么验证是否生效
修改完成后,再次运行之前的 SSH 连接命令。如果不再出现 Permissions 报错,且开始提示输入密码或直接登录,说明修复成功。也可以使用 verbose 模式观察:
ssh -v -i ~/.ssh/id_rsa user@host
观察输出日志,确认没有 Bad permissions 或 ignore key 相关的警告信息。
常见坑
- 公钥私钥混淆:只需要修改私钥(通常无后缀或 .pem)的权限,公钥(.pub)权限要求不严格,但建议保持一致。
- Windows 生成的密钥:在 WSL 或 Linux 中使用 Windows 生成的密钥时,文件系统权限可能映射错误,建议复制到 Linux 原生目录后重新 chmod。
- SELinux 限制:极少数情况下,即使权限正确,SELinux 上下文不对也会导致无法读取,可通过 restorecon 修复。
- 密钥格式错误:如果修改权限后报 Load key ...: invalid format,可能是密钥文件损坏或换行符问题,与权限无关。