gcloud compute copy-files 成功但没有文件出现

gcloud compute copy-files succeeds but no files appear

我正在将数据从本地计算机复制到计算引擎实例:

gcloud compute copy-files /Users/me/project/data.csv instance-name:~/project

命令运行并完成:

data.csv 100%   74KB  73.9KB/s   00:00

但是,我无法在我的计算引擎实例上的任何地方找到它。它在 ~/project 文件夹中不可见。是它无声地失败了还是我看错地方了?

简答

很可能您查错了 $HOME。确保你正在寻找 在您要从中复制的同一用户的主目录中(它将是 如果以前不存在,则在远程主机上创建)。

不那么简短的回答

如果您在调用 copy-files 时未指定任何远程用户,则 gcloud 将尝试找出使用哪个用户登录。如果 你看看gcloud源代码:

# $CLOUD_SDK_ROOT/lib/surface/compute/copy_files.py

# [...]

user_host, file_path = arg.split(':', 1)
user_host_parts = user_host.split('@', 1)
if len(user_host_parts) == 1:
    user = ssh_utils.GetDefaultSshUsername(warn_on_account_user=True)
    instance = user_host_parts[0]
else:
    user, instance = user_host_parts

# [...]

在您的情况下,由于您没有指定任何用户,GetDefaultSshUsername() 将被调用,它的任务是找到一个有效的 SSH 用户名 采用。为此,它将选择符合以下条件的第一个选项 顺序:

  1. 如果当前 $USER 在特定于 GCE 的约束下有效,则使用当前的 $USER——即, 不包含空格的 ASCII 字符。
  2. 否则,从当前登录的gcloud帐户中提取用户名 在(你可以通过 运行 gcloud auth list 来检查它是哪一个)

再一次,源代码告诉我们最终的真相:

# $CLOUD_SDK_ROOT/lib/googlecloudsdk/api_lib/compute/ssh_utils.py

def GetDefaultSshUsername(warn_on_account_user=False):
    # [...]
    user = getpass.getuser()
    if not _IsValidSshUsername(user):
        full_account = properties.VALUES.core.account.Get(required=True)
        account_user = gaia_utils.MapGaiaEmailToDefaultAccountName(full_account)
        if warn_on_account_user:
            log.warn('Invalid characters in local username [{0}]. '
                     'Using username corresponding to active account: [{1}]'.format(user, account_user))
        user = account_user
    return user

所以,现在我们大致了解了如何选择远程用户名的过程 有效,我有根据的猜测是您使用 与后来检查远程实例的用户不同 如果文件在那里,因为默认情况下他们会登陆他们的 各自的 – 和不同的 – $HOME 目录。