我曾经通过 VS code 进行远程开发。我在本地 Windows 10 上创建了 SSH 密钥,并将公钥添加到 VM 实例。一周一切都很好。但是今天我的 VS Code 突然显示权限被拒绝。所以我尝试在 GCP 控制台中找出原因。这是我发现的,但我不知道原因是什么以及如何解决它。
- 防火墙规则正确且未更改。
- 无法通过单击虚拟机实例列表 > 连接 > SSH 连接到 GCP 控制台中的虚拟机。显示“连接失败”。单击“故障排除”按钮将显示虚拟机状态正常和网络状态正常,但在检查用户权限时卡在加载时。
从这里开始,我认为它与某些权限问题有关,也许是 SSH 密钥?
- 然后我在本地 Windows 10 上创建了一个新的 SSH 密钥对。
- 然后,新密钥将添加到 VM。未设置到期日期,仅设置“{KEY} {USER}”。但是,我仍然无法通过 VScode 连接 SSH。
- 连接到 GCP 中的虚拟机仍然失败
- 我尝试创建一个新的虚拟机并使用 SSH 密钥对进行测试。关键是工作。我可以用 VS code 连接。
然后我尝试“查看日志”。并发现每次记录用户 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"
然后它要求输入密码。但我记得我之前没有设置密码。
请帮忙。我很沮丧。虽然我有备份并且可以将其加载到新实例上,但我真的想弄清楚重新启动后这是如何发生的,如何修复它以及如何防止它。
预先感谢您阅读本文。
Permission denied (publickey)
出现错误“ ”的原因有多种。请遵循以下 2 个解决方法,这可能有助于解决您的问题:不可能从 Linux VM 中获取实际密码(已加密),但如果您想在 Linux VM 上获取/重置本地用户的密码,则可以设置新密码。
解决方法 1:通过启动脚本重置密码:
此启动脚本可用于在实例启动时设置临时密码(将 [用户名] 和 [密码] 替换为实际用户名和您选择的临时密码:
方法一:
如果您没有 root 密码,请按照以下步骤使用启动脚本将其添加到您的实例:
转到 GCP 控制台中的虚拟机实例页面。
单击要为其添加启动脚本的实例。
单击页面顶部的编辑按钮。
点击“
Enable connecting to serial ports
”在自定义元数据下,您将找到“
Automation
”部分。将下面的“
Value
”设置到“Startup script
”框中:方法一:
方法2:
单击“保存”,然后单击页面顶部的“重置”。您可能需要等待一段时间实例才能重新启动。
单击
Connect to serial port
页面上的“ ”。在新窗口中,您可能需要稍等一下,然后按
Enter
一次键盘上的“ ”;然后,您应该会看到登录提示。使用您提供的根和密码登录。
注意:重新获得虚拟机的访问权限后,请删除您输入的自定义元数据,否则它将在每次实例重新启动时执行。此外,省略此步骤可能会在控制台中暴露 root 密码。
解决方法2: 检查您的问题可能是由于实例上缺少主机密钥,或者主机密钥的权限已被修改。请按照以下步骤验证此行为并解决问题:
/etc/ssh/ssh_host_rsa_key
如果串口控制台可以连接到实例,则使用目录ls -ltrh
中的命令检查文件的权限/etc/ssh
。文件的权限应该是-rw-r---r--。如果没有,
chmod 644 ssh_host_rsa_key
可以使用命令来设置权限。如果串行控制台连接不起作用,请通过在救援实例上安装启动磁盘来检查权限。
创建启动磁盘的快照。请参阅创建快照
创建救援实例并附加快照的附加磁盘。
运行
lsblk -f
以识别添加的辅助磁盘。使用命令挂载磁盘
创建目录命令:
mkdir ~/recovery
挂载磁盘命令:mount -o nouuid <disk_path> ~/recovery
检查目录下是否有
ssh_host_rsa_key
和文件,并参照步骤2验证权限。ssh_host_rsa_key.pub
/etc/ssh/
如果文件不存在,则为实例生成密钥。通过运行以下命令更改根目录:
chroot ~/recovery/
通过运行以下命令生成主机密钥:
使用救援虚拟机卸载磁盘
umount ~/recovery
并将磁盘与实例分离将磁盘连接回受影响的实例并重新启动该实例。