为什么我无法访问Google Compute Engine虚拟机? [英] Why am I Unable to Access a Google Compute Engine VM?
问题描述
我无法使用Google Cloud SDK(gcloud
)访问Google Compute Engine(GCE)虚拟机($GCE_INSTANCE_NAME
):
gcloud compute
--project=$GCP_PROJECT_ID
ssh
--zone=$GCE_INSTANCE_ZONE
$GCE_INSTANCE_NAME
#=>
Permission denied (publickey).
ERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255].
我已尝试:
吊销SSH密钥:
gcloud auth revoke --all
-
gcloud auth login
要再次访问
$GCE_INSTANCE_NAME
,请使用以下命令:gcloud compute --project=$GCP_PROJECT_ID ssh --zone=$GCE_INSTANCE_ZONE $GCE_INSTANCE_NAME #=> ERROR: (gcloud.compute.ssh) Could not fetch resource: - Required 'compute.instances.get' permission for 'projects
要成功地ssh
进入$GCE_INSTANCE_NAME
,我可以执行哪些步骤?
推荐答案
权限被拒绝(Public Key)。错误:(gcloud.computer te.ssh)[/usr/bin/ssh]已退出,返回代码为[255]。
此错误似乎指的是SSH密钥的某些错误或Linux来宾环境不完整。
我想知道运行gcloud auth revoke --all
您能提供以下命令的输出吗?
$ gcloud compute instances describe name-of-your-instance --zone
zone-the-instance-is-in --project name-of-your-project$ gcloud compute instances get-serial-port-output name-of-your-instance --zone zone-the-instance-is-in --project name-of-your-project
$ gcloud compute firewall-rules list --project name-of-your-project
这些命令可能很有帮助,因为:
- 使用此命令,我们可以检查ssh密钥的状态 实例和实例中启用的作用域(以及 其他信息)
- 此命令提供实例中的serial output log entries,可以帮助解决您遇到的连接问题。请注意,此日志在实例重启后会被擦除,因此不要期望这里有持久日志,但此信息可能对您的情况有用。
- 此命令在您的项目中输出firewall rules;如果没有,则应该有允许端口22上的TCP入站通信的默认或经过管理的防火墙规则(您需要创建一个)。
您是否尝试过匿名模式下的to SSH from the browser? 有时,浏览器扩展可能会阻止SSH在浏览器功能上正常运行,这就是我推荐匿名模式的原因。
编辑 为了使这篇帖子对社区有用(并且更容易阅读),我在这里总结了下面的一些评论:
显示的错误:
无法获取资源:-必需的‘Compute.instances.get’项目的权限//区域//实例/
操作:检查用户角色/权限
$ gcloud beta iam roles list --account your-account-here
> --- description: Full management of App Engine apps (but not storage).
> etag: AA== name: roles/appengine.appAdmin stage: GA title: App Engine Admin
> --- description: Ability to view App Engine app status. etag: AA== name: roles/appengine.appViewer stage: GA title: App Engine Viewer
根据上面的输出:用户只有App Engine权限(没有Compute Engine中的权限)
操作:要求项目所有者添加一个角色,授予用户访问GCE实例的权限(实例管理员角色、计算管理员角色) 此处可用角色列表:cloud.google.com/compute/docs/access/iam#instance_admin_role
需要信息,请运行2个命令:
为了查看实例中的日志:
$gcloud计算实例获取串行端口输出实例名称区域实例在项目中项目名称
SeaBIOS(版本1.8.2-20180102_145157-GOOGLE)内存总大小=0x000000006cc00000=找到1740MiB CPU:1支持的最大CPU数: 256在0:3找到virtio-scsi virtio-scsi供应商=‘google’product=‘PersistentDisk’rev=‘1’type=0 Removable=0 Virtio-SCSI块大小=512个扇区=20971520=10240 MiB驱动器0x000f2330:pchs=0/0/0转换=LBA LCHS=1024255/63s=20971520 正在从硬盘0启动.[0.000000][font=宋体] 正在初始化cgroup Subsys cpuset[0.000000] 正在初始化cgroup子系统CPU[0.000000] 正在初始化cgroup子系统cpuacct[0.000000] Linux版本3.16.0-0.bpo.4-amd
确认存在允许端口22上的入站通信的防火墙规则:
$gCloud计算防火墙-规则列表--项目名称 名称网络方向优先级允许 DEFAULT-ALLOW-SSH默认入口65534 tcp:22/li>
从上面的输出中,允许SSH通信的防火墙规则的优先级为65534。 优先级是一个从0到65535的整数,两者都包括在内。 较低的优先级值表示较高的优先级。 换句话说,1比2优先级高。 有关详细说明,请阅读this document
更新防火墙规则以设置更高的优先级。 为此,请运行命令:$ gcloud compute firewall-rules update --priority 1000 default-allow-ssh
问题:我尝试通过SSH连接到实例,但仍然收到相同的旧错误:SSH:连接到主机X.XX.XX.XX端口22:操作超时错误:(gcloud.computer te.ssh)[/usr/bin/ssh]退出,返回代码为[255]
检查ssh服务是否在实例中运行。 运行以下命令获取实例IP:
$ gcloud compute instances describe [NAME_OF_YOUR_INSTANCE] --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
安装Netcat=>是用于读取/写入网络连接的计算机网络实用程序:
$ sudo apt-get install netcat
运行以下命令以检查该命令的输出:
$ nc [EXTERNAL_IP] 22
>
问题:运行NC[EXTERNAL_IP]22未返回任何信息
检查您的实例中是否启用了Linux来宾环境。 为此,您应该在GCE实例上添加启动脚本。 要将启动脚本添加到实例,请执行以下操作:
- 单击实例名称
- 单击编辑
- 转到"自定义元数据"部分
- 在"key"文本字段中添加:start-script
- 在"Value"文本字段中添加:
#! /bin/bash sudo systemctl list-unit-files | grep google | grep enabled
- 保存更改
More detailed info on startup scripts也可用。
然后重新启动实例,以便允许执行脚本。 验证Linux来宾环境脚本是否已安装并正在运行。 为此,请检查来自GCE实例的串行日志控制台中启动脚本的输出。 您可以勾选the expected outputs for the different Operating Systems。如果未安装Linux来宾环境,请重新安装。 您可以按照this documentation安装LGE。
这篇关于为什么我无法访问Google Compute Engine虚拟机?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!