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 用户名
采用。为此,它将选择符合以下条件的第一个选项
顺序:
- 如果当前
$USER
在特定于 GCE 的约束下有效,则使用当前的 $USER
——即,
不包含空格的 ASCII 字符。
- 否则,从当前登录的
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
目录。
我正在将数据从本地计算机复制到计算引擎实例:
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 用户名
采用。为此,它将选择符合以下条件的第一个选项
顺序:
- 如果当前
$USER
在特定于 GCE 的约束下有效,则使用当前的$USER
——即, 不包含空格的 ASCII 字符。 - 否则,从当前登录的
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
目录。