如何访问谷歌云平台计算引擎VM实例的SSH密钥?

74

我通过Google Cloud Web控制台从CentOS 6.x镜像创建了一个新的实例。在创建表单中,我看到了一个空白处,可以粘贴现有的SSH密钥;由于这是我的第一个实例,我还没有密钥。我以为它会像Amazon EC2一样带我完成密钥创建过程,但它并没有。

实例似乎已经创建成功,但我无法找出如何获取它的SSH密钥。实例网页上有一个按钮,上面写着“SSH”,它让我通过模拟SSH会话的弹出式Web浏览器窗口短暂地登录。然而,它只让我进入用户级别的帐户,而不是root。弹出菜单中有一个选项可以更改用户,将其更改为root除了生成连接错误之外什么也没有做。现在我完全无法登录我的实例!

我已经搜索过,但找不到任何简单明了的文档来解释Google Compute实例的这个方面。

我是否需要自己手动创建SSH密钥,并在实例创建期间将它们粘贴到表单中?我是否漏掉了明显的步骤?

8个回答

97
默认情况下,新的Google Compute Engine(GCE)虚拟机实例没有预先分配的SSH密钥,因此您无法“检索”它们,因为它们不存在。您需要自己创建它们,或者使用像gcloud(请参见下文)这样的工具,如果您还没有SSH密钥,它会提示您创建它们。
您有几种连接到新创建的GCE虚拟机的选项。
一种选项是在实例列表中的开发者控制台GUI旁边使用“SSH”按钮进行连接,这将打开一个浏览器窗口和一个终端会话到该实例。
如果您想通过命令行上的SSH客户端进行连接,您可以使用gcloud工具(Google Cloud SDK的一部分):
gcloud compute ssh example-instance

你可以在gcloud compute ssh帮助页面上看到完整的标志和选项,以及几个示例。
如果你还没有SSH密钥,它会提示你创建并连接到实例。如果你已经有了密钥,你可以使用现有的SSH密钥,它会将其传输到实例。
默认情况下,gcloud期望密钥位于以下路径:
  • $HOME/.ssh/google_compute_engine – 私钥
  • $HOME/.ssh/google_compute_engine.pub – 公钥
如果你想在gcloud中重用来自不同位置的密钥,请考虑创建符号链接或使用--ssh-key-file标志指向那里。
注意:如果您根本不使用gcloud,您必须手动将SSH密钥添加到实例的元数据中,如在实例级别设置SSH密钥中所述,您可以通过gcloud或通过Google Cloud控制台手动执行此操作。
您还可以使用ssh-keygen创建自己的密钥,这也是gcloud在幕后使用的工具。您可以直接使用ssh连接到实例而不是使用gcloud,但是您需要指定额外的参数来执行此操作:
ssh -i KEY_FILE -o UserKnownHostsFile=/dev/null \
    -o CheckHostIP=no -o StrictHostKeyChecking=no \
    USER@IP_ADDRESS

这将需要以下参数:

  • KEY_FILE – [必需] 存储密钥的文件,例如 ~/.ssh/google_compute_engine

  • USER – [必需] 登录该实例的用户名。通常,这是运行 gcloud compute 的本地用户的用户名。

  • IP_ADDRESS – [必需] 实例的外部 IP 地址。

更多详细信息,请参阅 SSH 文档


3
你的意思是,当创建一个新的实例时,没有SSH密钥吗?我不能像为CentOS服务器创建SSH密钥那样进行传统的创建。相反,我必须使用Google工具gcloud来创建SSH密钥。但一旦创建完成后,我可以正常地通过SSH连接到该实例(即不需要使用gcloud或基于Web的SSH)。我会尝试一下。唯一剩下的问题是这是否会给我root访问权限。在EC2上,你在创建实例时设置root SSH密钥,然后稍后创建用户级别的SSH密钥。gcloud生成的SSH密钥是root密钥吗? - steevithak
3
默认情况下实例中没有添加SSH密钥。我已更新答案,提供了有关使用ssh-keygenssh直接连接的信息。您的登录用户名将与本地用户名相同,但它将具有无密码的sudo访问权限,因此您不会直接登录为root,但sudo将授予您root访问特权。 - Misha Brukman
@MishaBrukman 它正在请求 $HOME/.ssh/google_compute_engine 的密码短语。这是什么?我没有为此创建任何密码短语。 - Anuran Barman
@MishaBrukman 它正在请求 $HOME/.ssh/google_compute_engine 的密码短语。这是什么?我没有为此创建任何密码短语。 - Anuran Barman
@AnuranBarman — 如果您创建了 $HOME/.ssh/google_compute_engine 密钥而没有提供密码,那么当它要求输入密码时,您只需按 <kbd>Enter</kbd> 即可。您还可以运行 ssh-add ~/.ssh/google_compute_engine,如果您可以成功添加而不需要提供密码,则应该也可以使用 gcloud。如果这样仍然无法解决问题,您可以删除该密钥并使用 ssh-keygen 手动创建一个,然后您将必须指定密码以创建该密钥。 - Misha Brukman
我特别选择使用AWS而不是GCP,原因如下。 - momo668

42

使用ssh登录实例-[所有步骤在Linux Ubuntu 16.04上执行]

  1. 创建SSH密钥 ssh-keygen -t rsa -f ~/.ssh/gcloud_instance1 -C varunon9 这里的 gcloud_instance1 是密钥文件名,varunon9 是用户名。

  2. 打印公钥文件内容 cd ~/.ssh && cat gcloud_instance1.pub

  3. 单击编辑VM实例详细信息图标enter image description here

  4. 将公钥文件的内容(即cd ~/.ssh && cat gcloud_instance1.pub的输出)粘贴到ssh-keys文本区域中

    enter image description here enter image description here

  5. 单击保存

  6. 现在可以通过ssh从终端登录到您的实例 ssh -i gcloud_instance1 varunon9@35.200.201.56, 这里的gcloud_instance1是私钥文件(在.ssh目录中),varunon9是用户名,35.200.201.56是您实例的外部IP。


1
在这个上下文中,UserName是什么?例如,在VM终端中,someName@instanceName:~$。 - Billy
5
在Google Cloud平台中,用户名是关键评论(varunon9是示例答案中的用户名),它必须与您尝试登录的用户名匹配。请参见此处 - Jossef Harush Kadouri

8

为多个实例创建和使用一对 SSH 密钥的最简单方法:

第 1 步:https://putty.org/ 安装 putty 和 puttyGen。

第 2 步:在本地桌面 / 笔记本电脑中的终端中打开命令行(在 Windows 10 及更高版本中,您可以使用 Windows Linux 子系统)。

键入:ssh-keygen

在提示符下输入文件名,例如:google_key

将创建 2 个文件 google_key 和 google_key.pub。

第 3 步:复制 google_key.pub 的全部内容。

注意没有换行符。所有内容都应该在一行上。

第 4 步:在创建任何 VM 实例之前,请转到Compute Engine -> Metadata

选择“SSH 密钥”选项卡,然后点击“添加 SSH 密钥”按钮。

粘贴 google_key.pub 的内容。如果正确粘贴了内容,您应该会看到用户名显示在左标签上。然后点击保存。

第 5 步:现在在 Google Compute 下创建您喜欢的 VM 实例。

复制外部 IPvm_instance_external_ip

回到 Linux 终端并键入

ssh -i google_key.pub username@vm_instance_external_ip

键入“yes”

现在您应该可以使用了。

如果您需要视频说明,请单击此处


2
哦,终于在两天后解决了。谢谢你啊。在结尾处的视频链接对我来说是最有帮助的部分。我猜错误在于我一直先创建VM实例,然后在元数据部分分配sshkey。我还是不确定。 - user9869932
当我点击保存时,它会显示无效密钥。所需格式为:<protocol> <key-blob> username@example.com 或者 <protocol> <key-blob> google-ssh {"userName":"username@example.com","expireOn":"<date>"} - 你能否粘贴一下 google_key.pub 的内容看看? - Thorsten Staerk

4
要在您的计算机中填充SSH配置文件,请使用:
gcloud compute config-ssh

3

如果有人想要将项目范围的SSH密钥添加到他们的Google Cloud Platform(GCP)项目中,$GCP_PROJECT_NAME

  1. Generate an Ed25519-based SSH key:

    ssh-keygen -t ed25519 -C "$(whoami)@$(hostname)"
    
    #=>
    
    Generating public/private ed25519 key pair.
    Enter file in which to save the key (/. . ./.ssh/id_ed25519):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in id_ed25519.
    Your public key has been saved in id_ed25519.pub.
    The key fingerprint is:
    SHA256:. . . "$(whoami)@$(hostname)"
    The key's randomart image is:
    +--[ED25519 256]--+
    |      . . .      |
    +----[SHA256]-----+
    
  2. Install the Google Cloud SDK (gcloud) from here

  3. Make sure you're logged-in as the correct user:

    gcloud config list --format="value(core.account)"
    

    if not, log-in using:

    gcloud auth login
    
  4. Make sure you're connected to $GCP_PROJECT_NAME with:

    gcloud config list --format="value(core.project)"
    

    if not, switch to $GCP_PROJECT_NAME with:

    gcloud config set project $GCP_PROJECT_NAME
    
  5. Making use of the filter() and firstof() transforms available for gcloud allows your to avoid generating a temporary file and only use a single command to add that SSH key to $GCP_PROJECT_NAME:

    gcloud compute project-info add-metadata \
    --metadata ssh-keys="$(gcloud compute project-info describe \
    --format="value(commonInstanceMetadata.items.filter(key:ssh-keys).firstof(value))")
    $(whoami):$(cat ~/.ssh/id_ed25519.pub)"
    
    #=>
    
    Updated [https://www.googleapis.com/compute/v1/projects/$GCP_PROJECT_NAME].
    
  6. You should now see that Ed25519-based SSH key now in $GCP_PROJECT_NAME; check with:

    gcloud compute project-info describe \
    --format="value(commonInstanceMetadata.items.filter(key:ssh-keys).firstof(value))"
    
使用 OpenSSH 只需几个简单步骤即可安全地进入计算虚拟机(VM):
  1. Find the external IP ($GCP_VM_ADDRESS) for the VM you wish to secure shell into with:

    gcloud compute instances list \
    --format=table"[box=true](name:label=NAME, networkInterfaces[].accessConfigs[].natIP.flatten():label=EXTERNAL_IP)"
    
    #=>
    
    ┌──────────────┬─────────────────┐
    │     NAME     │  EXTERNAL_IP    │
    ├──────────────┼─────────────────┤
    │     . . .    │      . . .      │
    │ $GCP_VM_NAME$GCP_VM_ADDRESS │
    │     . . .    │      . . .      │
    └──────────────┴─────────────────┘
    

    Note: if you haven't created a VM yet, be sure to follow the instructions here.

  2. You should now be able to just:

    ssh $(whoami)@$GCP_VM_ADDRESS
    

这看起来很不错,但是当我尝试时仍然会出现权限被拒绝的情况。我在某个地方读到过,Google VMs 不喜欢尝试使用 root 登录,但对于其他用户似乎也不起作用。 - Tony Bogdanov

2
我找到了一个有用的按钮,可以帮助避免猜测不同gcloud参数(例如versionId,serviceId等)的游戏。
查看gcloud命令 --> ssh screenshot 最初的回答:我发现了一个有用的按钮,可以帮助避免猜测不同gcloud参数(例如versionId,serviceId等)的游戏。点击该按钮,您可以查看gcloud命令,并轻松获得所需的参数值。

1
非常感谢,我试着做这个简直要疯了。 - rhedak

1
一旦您打开控制台,请尝试在ssh选项卡中查看gcloud命令。 gcloud客户端将使用以下命令打开。

gcloud compute --project ssh --zone

如果这是第一次使用,则它将为您创建ssh密钥。 您只需在右上角使用gcloud客户端下载文件选项下载此位置的文件 ~/.ssh/google_compute_engine。 获取密钥文件后,只需发出以下命令

ssh -i username@external_IP


嗨,我有一个类似的问题,我在一个谷歌计算引擎上创建了一个ssh密钥,将公钥复制到另一个谷歌计算引擎上,然后尝试从一个节点ssh到另一个节点。但是,我遇到了权限错误。为了解决这个问题,我需要按照上述类似步骤进行吗? - user2872898

0

概念很简单,如果您拥有SSH私钥,则可以连接到服务器。上面给出的答案是@isma很容易的一个。

所以

  • 在desktop-shell/GCP-sdk中创建SSH密钥:ssh-keygen生成公钥/私钥
  • 将公钥放入Gcloud Compute- SSH中
  • 现在使用以下命令从desktop-shell/GCP-sdk连接: ssh -i google_key username@vm_instance_external_ip

或者

使用putty下载@Abubacker提到的私钥并打开Putty

  • 提供IP地址
  • 在SSH-Auth中打开私钥

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接