cloud/gsutil 将文件从实例复制到存储桶

cloud/gsutil copy files from instance to bucket

我已经从实例内部尝试了 gsutil rsync/cp,它可以工作。 我正在寻找一种方法 运行 使用 gcloud/gsutil cli 从本地计算机同步。 是否有像 gcloud compute scp 这样的命令可以从实例同步到存储桶? [编辑] 我查看了官方文档,但找不到这样的示例。

如果我了解到您想 运行 在云外的机器上执行命令 ,这将在 云 VM 之间同步文件 和一个桶,然后不,没有这样的命令,这在设计上是不可能的。想一想:一个虚拟机可以运行Linux、Windows,甚至是你自己开发的OS。 (还记得 Linus Torvalds 那个曾经只是为了好玩而这样做的人吗?这个。)这不可能由 GCE 本身支持。出于同样的原因,这甚至在另一个 VM 上也是不可能的,不仅仅是在您的本地计算机上。

但是,只要您可以从本地计算机通过 ssh 连接到实例,同样的 gsutil rsync ... 也可以通过 ssh 连接正常工作:

ssh instance-1 'gsutil rsync ...'

只是不要错过或弄乱引号。如果您使用 gcloud compute ssh 而不是仅 ssh 登录实例,则将改为(注意 -- 告诉 gcloud 应传递其余参数至 ssh).

gcloud compute ssh instance-1 -- 'gsutil rsync ...'

gsutil 无论您在哪里调用命令,都可以在两个存储桶之间有效地复制和同步数据;数据永远不会离开云端。这是可能的,因为水桶是 Google 自己的装置,它们完全控制 API。但是进入一个工作的虚拟机 运行 随机 OS 和 reading/writing 文件是根本不可能的。


此技术甚至适用于整个内联 shell 脚本。例如,这是我用来设置新实例的脚本的一部分(我产生了很多临时虚拟机,所以我想要一个解决方案,例如缺少 bash 完成包等):

ssh "$target" '
  set -eu
  cd ~
  if [[ -f .kkm-config-done ]]; then
    echo "### STOP: .kkm-config-done exists, not overwriting files"
    exit 1
 . . . .
 '

注意单独的单引号,结束唯一的 ssh 参数。


切线:阅读 IAP 隧道,它可以让你通过 ssh 进入你的实例,而不会将监听的 ssh 端口暴露给整个互联网(hic sunt dracones :))。它们是免费的并且非常安全。在一般情况下,只需将 --tunnel-through-iap 开关添加到 gcloud compute ssh 命令即可。指针在此开关的文档中。