GCP:如何使用 CLI 通过 SSH 连接到新创建的 VM?

GCP: how to use CLI to connect with SSH to newly created VM?

我想我在下面的脚本中遗漏了一步。

我第一次 运行 它时,虚拟机创建得很好,但连接被拒绝。即使我在创建 VM 后等待十分钟,它仍然被拒绝。

但是,如果我使用 GCP 控制台手动连接 "Open in browser window",我会收到消息 "Transferring SSH keys...",并且连接正常。完成此步骤后,脚本可以正常连接。

我应该向这个脚本添加什么才能让它工作而无需从控制台手动连接?

#!/bin/bash
MY_INSTANCE="janne"
MY_TEMPLATE="dev-tf-nogpu-template"
HOME_PATH="/XXX/data/celeba/"


# Create instance
gcloud compute instances create $MY_INSTANCE --source-instance-template $MY_TEMPLATE

# Start instance 
gcloud compute instances start $MY_INSTANCE

# Copy needed directories & files
gcloud compute scp ${HOME_PATH}src/ $MY_INSTANCE:~ --recurse --compress
gcloud compute scp ${HOME_PATH}save/ $MY_INSTANCE:~ --recurse --compress
gcloud compute scp ${HOME_PATH}pyinstall $MY_INSTANCE:~
gcloud compute scp ${HOME_PATH}gcpstartup.sh $MY_INSTANCE:~

# Execute startup script
gcloud compute ssh --zone us-west1-b $MY_INSTANCE --command "bash gcpstartup.sh"

# Connect over ssh
gcloud compute ssh --project XXX --zone us-west1-b $MY_INSTANCE

这个脚本的完整输出是:

(base) xxx@ubu-dt:/XXX/data/celeba$ bash gcpcreate.sh
Created [https://www.googleapis.com/compute/v1/projects/XXX/zones/us-west1-b/instances/janne].
NAME   ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
janne  us-west1-b  n1-standard-1               XXX   XXX  RUNNING
Starting instance(s) janne...done.                                                                                                                                               
Updated [https://compute.googleapis.com/compute/v1/projects/xxx/zones/us-west1-b/instances/janne].
ssh: connect to host 34.83.3.161 port 22: Connection refused
lost connection
ERROR: (gcloud.compute.scp) [/usr/bin/scp] exited with return code [1].
ssh: connect to host 34.83.3.161 port 22: Connection refused
lost connection
ERROR: (gcloud.compute.scp) [/usr/bin/scp] exited with return code [1].
ssh: connect to host 34.83.3.161 port 22: Connection refused
lost connection
ERROR: (gcloud.compute.scp) [/usr/bin/scp] exited with return code [1].
ssh: connect to host 34.83.3.161 port 22: Connection refused
lost connection
ERROR: (gcloud.compute.scp) [/usr/bin/scp] exited with return code [1].
ssh: connect to host 34.83.3.161 port 22: Connection refused
ERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255].
ssh: connect to host 34.83.3.161 port 22: Connection refused
ERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255].

编辑:添加 gcloud 版本信息

(base) bjorn@ubu-dt:/media/bjorn/data/celeba$ gcloud version
Google Cloud SDK 269.0.0
alpha 2019.10.25
beta 2019.10.25
bq 2.0.49
core 2019.10.25
gsutil 4.45
kubectl 2019.10.25

当您通过控制台连接时,它会为您管理密钥。

你最后的评论让我相信,当你从控制台连接时,你正在生成一个 SSH 密钥,它以某种方式允许你 运行 脚本,我建议你看一下如何管理元数据中的 SSH keys 并创建您自己的 SSH 密钥以通过 SDK 进行访问。

如果在脚本之外通过 SDK 无法直接 SSH,那么我认为这是因为生成密钥的相同原因。

另外请确保在使用 SDK 时服务帐户具有正确的权限。

告诉我。

我找到的解决方案是这样的:等待。

对于OS登录,SSH在实例启动后约20秒开始工作。 对于非OS登录,大约需要一分钟。

所以我只是在 gcloud 计算实例启动后添加了这个 $MY_INSTANCE

sleep 20s