出现 SSH 连接报错 permission denied (publickey) 通常是因为客户端使用的私钥与实例记录的公钥不匹配,或者登录用户名错误。最推荐的处理方向是核对 SSH 命令中的用户名和私钥路径,若私钥丢失则通过甲骨文云控制台重置 SSH 密钥。风险边界在于重置密钥可能需要重启实例或通过串行控制台操作,且旧密钥将立即失效。
先说结论:确认登录用户名和私钥文件匹配是解决该报错的首要步骤,若密钥丢失需通过控制台重置。
- 先确认:Linux 实例默认用户名为 opc 或 ubuntu,非 root
- 先处理:检查本地私钥文件权限是否为 400 且路径正确
- 再验证:使用 ssh -v 模式查看认证细节确认密钥被发送
命令速用版
以下命令用于检查密钥权限并发起连接,适用于 Linux 或 macOS 终端。
chmod 400 /path/to/private_key ssh -i /path/to/private_key username@instance_public_ip
若使用 Windows PowerShell,权限命令改为 ACL 设置或直接通过 PuTTY 转换 ppk 格式。
为什么会这样
SSH 服务拒绝公钥认证是因为服务端没有信任客户端提供的私钥对应的公钥。甲骨文云实例在创建时生成密钥对,公钥注入实例元数据,私钥由用户保存。若本地私钥丢失、损坏或权限过于开放,SSH 客户端会跳过该密钥或服务端拒绝读取。另外,不同操作系统镜像默认登录用户不同,使用错误用户名也会导致服务端在 authorized_keys 中找不到对应条目。
分步处理
按顺序执行以下步骤,每步完成后尝试连接,若成功则停止后续操作。
步骤 1:核对登录用户名
甲骨文云 Oracle Linux 镜像默认用户名为 opc,Ubuntu 镜像默认用户名为 ubuntu。不要使用 root 用户直接登录,除非已在内部配置允许。命令示例:ssh -i ~/.ssh/oci_key opc@123.123.123.123
步骤 2:检查私钥文件权限
SSH 客户端要求私钥文件权限必须受限,否则会报错 ignored key。在 Linux/macOS 终端执行:chmod 400 ~/.ssh/oci_key
验证权限:ls -l ~/.ssh/oci_key 应显示 -r--------。
步骤 3:确认私钥匹配
若持有多个密钥文件,确认创建实例时下载的是哪一个。若不确定,可尝试在 SSH 命令中增加 -v 参数查看调试信息,观察 Output 中是否显示 Offering public key 及后续 Authentication succeeded。
步骤 4:控制台重置密钥(仅限密钥丢失)
若私钥彻底丢失,登录甲骨文云控制台,进入实例详情页。选择更多操作中的重置 SSH 密钥。部分实例类型支持在线重置,部分需要停止实例后修改元数据。重置后下载新私钥,旧私钥立即失效。
怎么验证是否生效
成功连接后,终端提示符会变为 username@hostname:~$ 形式。执行 whoami 命令应返回当前登录用户名。若使用 ssh -v 调试模式,日志末尾应显示 Authentication succeeded 且无 Permission denied 报错。若仍报错,检查服务端日志 /var/log/secure 或 /var/log/auth.log 查看 SSH daemon 拒绝的具体原因。
常见坑
- 误用 root 用户:甲骨文云默认禁用 root 密码和密钥登录,必须先用 opc 或 ubuntu 登录再切换。
- 密钥格式错误:Windows 用户若使用 PuTTY,需将 pem 格式私钥转换为 ppk 格式,OpenSSH 格式私钥在 PuTTY 中无法直接使用。
- 安全列表混淆:端口 22 未开放通常导致 Connection timed out,而非 Permission denied,不要误判为密钥问题。
- 云初始化失败:极少数情况下云初始化脚本未正确写入 authorized_keys,此时需通过串行控制台修复。
常见问题
为什么不能用 root 用户直接 SSH 登录?
甲骨文云安全策略默认禁用 root 远程登录以降低风险。需先使用 opc 或 ubuntu 用户登录,再通过 sudo su 切换权限。
私钥文件丢失了怎么办?
必须通过甲骨文云控制台重置 SSH 密钥。若实例支持在线重置可直接操作,否则需停止实例后修改元数据并下载新私钥。
Windows 上提示 Permission denied 如何解决?
确认使用的是 PuTTY 生成的 ppk 格式私钥而非 pem 格式。在 PuTTY 配置中正确加载私钥文件,并确认登录用户名为 opc 或 ubuntu。
参考来源
- Oracle Help Center, "Accessing an Instance Using SSH", https://docs.oracle.com/en-us/iaas/Content/Compute/Tasks/accessinginstance.htm
- Oracle Help Center, "Resetting SSH Keys", https://docs.oracle.com/en-us/iaas/Content/Compute/Tasks/resettingsshkeys.htm