重启后无法通过 SSH 连接到 GCP VM

重启后无法通过 SSH 连接到 GCP VM

我曾经通过 VS Code 进行远程开发。我在本地 Windows 10 上创建了 SSH 密钥,并将公钥添加到 VM 实例。一周内一切都很顺利。但是今天我的 VS Code 突然显示权限被拒绝。所以我尝试在 GCP 控制台中找出原因。这是我发现的,但我不知道原因是什么以及如何修复它。

  • 防火墙规则正确且未改变。
  • 无法通过单击虚拟机实例列表 > 连接 > SSH 连接到 GCP 控制台中的虚拟机。它显示“连接失败”。单击“故障排除”按钮将显示虚拟机状态正常和网络状态正常,但在检查用户权限时卡在加载状态。

从这里,我认为它与某些权限问题有关,也许是 SSH 密钥?

  • 然后我在本地 Windows 10 上创建了一个新的 SSH 密钥对。
  • 然后将新密钥添加到虚拟机。没有设置到期日期,只有“{KEY} {USER}”。但是,我仍然无法通过 VScode 连接 SSH。
  • 在 GCP 中连接到 VM 仍然失败
  • 我尝试创建一个新的虚拟机并使用 SSH 密钥对进行测试。密钥有效。我可以使用 VS 代码进行连接。

然后我尝试“查看日志”。发现每次记录用户 g3dayseo 的更新密钥时都会出现很多错误。以下是一些示例。

标题

Updating keys for user g3dayseo.
{
insertId: "27ysnuf4tckja"
jsonPayload: {
localTimestamp: "2023-06-30T00:09:42.8300Z"
message: "Updating keys for user g3dayseo."
}
logName: "projects/beautylnfcom/logs/GCEGuestAgent"
receiveTimestamp: "2023-06-30T00:09:43.842531278Z"
resource: {2}
severity: "INFO"
sourceLocation: {3}
timestamp: "2023-06-30T00:09:42.830084525Z"
}

标题

Invalid ssh key entry - expired key: g3dayseo:ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFKv3f/jQZRbGdQnvL5Swy6f/E4Z84nnwHfgyiorYPu5VS5GF9yOOTe3wFFtGLFQns0qHtzIn2MgsEfQQIml8Vk= google-ssh {"userName":"[email protected]","expireOn":"2023-06-30T00:12:27+0000"}

内容

{
insertId: "1js4l5ne4dso2"
jsonPayload: {
localTimestamp: "2023-06-30T00:12:42.9094Z"
message: "Invalid ssh key entry - expired key: g3dayseo:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCWSRpEt0TN03Jehtu0HEM2pXoJK7+wqZfss/TSbCGqPaZ4y36nZ8d/zyc9Q3cLkTFN9nYlDEwwUnG1UASpKBYox0Q7o/KTBOP0YGzksTPTvBjWaiUlCmZ/jAdj3ATaH5xyyjX89V5BXWAJRG2HxbW/U1r48Uk5Z+OZ8Q82MzYST6FkJbONp2jG9NEIiyg/oEj8iCpAMlh6xcioAlYZSyvAcKR6auCDkOcUTOkTG09/UG/3ZHdY+ZnMiMyGI1rc9fTN36yA7oSMvpKWxvk+caWpUTA4jlovxYIm5EeN9vk5BKK2YGt7cBNynZgA394M/mKAIk/n3rLaAVBitIexwntL google-ssh {"userName":"[email protected]","expireOn":"2023-06-30T00:12:41+0000"}"
}
logName: "projects/beautylnfcom/logs/GCEGuestAgent"
receiveTimestamp: "2023-06-30T00:12:43.919710439Z"
resource: {
labels: {3}
type: "gce_instance"
}
severity: "ERROR"
sourceLocation: {
file: "non_windows_accounts.go"
function: "main.getUserKeys"
line: "199"
}
timestamp: "2023-06-30T00:12:42.909503214Z"
}

我不知道现在该怎么办。我搜索了很多文章。有些建议我们在云壳上尝试。

gcloud compute ssh --zone "asia-east1-b" "newpostai" --project "beautylnfcom"

然后系统会要求输入密码。但我记得我之前没有设置过密码。

请帮忙。我真的很沮丧。虽然我有备份,我可以将其加载到新实例上,但我真的想弄清楚重启后为什么会发生这种情况,如何修复它以及如何防止它。

提前感谢您阅读本文。

答案1

错误“ Permission denied (publickey)”可能因多种原因而发生。请遵循以下 2 种解决方法,它们可能有助于解决您的问题:

不可能从 Linux VM 中获取实际密码(它已加密),但如果您想获取/重置 Linux VM 上本地用户的密码,则可以设置新密码。

解决方法 1通过启动脚本重置密码:

启动脚本可用于在实例启动时设置临时密码(将 [用户名] 和 [密码] 替换为实际用户名和您选择的临时密码:

方法 1:

#! /bin/bash
echo [Username] : [Password] | chpasswd

如果您没有 root 密码,请按照以下步骤使用启动脚本将其添加到您的实例:

  1. 转到 GCP 控制台中的 VM 实例页面。

  2. 单击要添加启动脚本的实例。

  3. 单击页面顶部的“编辑”按钮。

  4. 点击 ' Enable connecting to serial ports'

  5. 在自定义元数据下,您将找到“ Automation”部分。

  6. 将下面的‘ Value’设置到‘ Startup script’框中:

方法 1:

#! /bin/bash
echo root:PASSWORD | chpasswd

方法 2:

#! /bin/bash
usermod -p $(echo "password" | openssl passwd -1 -stdin) root
  1. 单击保存,然后单击页面顶部的重置。您可能需要等待一段时间才能重新启动实例。

  2. 点击Connect to serial port页面上的“ ”。

  3. 在新窗口中,您可能需要等待一会儿,然后按Enter键盘上的“ ”一次;然后,您应该会看到登录提示。

  4. 使用您提供的根和密码登录。

笔记 :重新获得对虚拟机的访问权限后,请删除您输入的自定义元数据,否则每次实例重新启动时它都会执行。此外,省略此步骤可能会在控制台中暴露 root 密码。

解决方法 2: 检查您的问题可能是由于实例上缺少主机密钥,或者主机密钥的权限已被修改。请按照以下步骤验证此行为并解决问题:

  1. 如果串行控制台可以连接到实例,则/etc/ssh/ssh_host_rsa_key使用目录ls -ltrh中的命令检查文件的权限/etc/ssh

  2. 文件的权限应为-rw-r---r--。如果不是,chmod 644 ssh_host_rsa_key可以使用命令来设置权限。

  3. 如果串行控制台连接不起作用,请通过在救援实例上安装启动盘来检查权限。

  4. 创建启动磁盘的快照。请参阅创建快照

  5. 创建一个救援实例并附加快照的附加磁盘。

  6. 运行lsblk -f以识别添加的辅助磁盘。

  7. 使用命令挂载磁盘

创建目录的命令:mkdir ~/recovery挂载磁盘的命令:mount -o nouuid <disk_path> ~/recovery

  1. 检查目录中的ssh_host_rsa_key和文件,并参考步骤2验证权限。ssh_host_rsa_key.pub/etc/ssh/

  2. 如果文件不存在,则为实例生成一个密钥。通过运行以下命令更改根目录:chroot ~/recovery/

通过运行以下命令生成主机密钥:

$ sudo ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
$ sudo ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
$ sudo ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
  1. 从救援虚拟机中卸载该磁盘umount ~/recovery,并将该磁盘从实例中分离

  2. 将磁盘重新连接到受影响的实例并重新启动该实例。

相关内容