所以我运行以下内容:
gsutil -m cp -R file.png gs://bucket/file.png
我收到以下错误消息:
Copying file://file.png [Content-Type=application/pdf]...
Uploading file.png: 42.59 KiB/42.59 KiB
AccessDeniedException: 401 Login Required
CommandException: 1 files/objects could not be transferred.
我不确定问题是什么,因为我跑了config
,我可以看到我的所有桶。有谁知道我需要做什么?
注意:我没有gcloud
,我刚刚安装了gsutil
并运行了配置。
答案 0 :(得分:2)
我得到了类似的响应,并且能够通过查看.boto文件的读取权限来解决此问题。就我而言,我使用的是服务帐户和
创建的.boto文件gsutil config -e
仅为用户设置了读取权限。由于它是由作为不同用户运行的服务读取的,因此无法读取该文件并产生401 Login Required错误。我通过添加服务组的读取权限来修复它。
在最不复杂的情况下,您可以通过向
授予任何用户读取权限来修复它chmod a+r .boto
要获取更多信息,请使用-D标志运行相同的命令,例如:
gsutil -m -D cp ....
在调试输出中,请查看:
Command being run: /path/to/gsutil
config_file_list: /path/to/boto/config
使用/ path / to / gsutil中的可执行文件创建登录凭据,而不是gcloud auth或计算机上的任何其他gsutil可执行文件,使用:
/path/to/gsutil config
对于服务帐户,请使用:
/path/to/gsutil config -e
这些应该在您的主目录$ HOME / .boto中创建一个.boto配置文件。如果您正在运行gsutil命令,则应在调试输出的config_file_list变量中引用此文件。如果没有,请参阅下面的内容进行更改。
如果您作为另一个用户运行,并且需要引用新创建的配置文件,请设置环境变量BOTO_CONFIG(不要忘记导出它):
BOTO_CONFIG=/path/to/$HOME/.boto
export BOTO_CONFIG
通过设置此变量,当您执行gsutil时,它将引用您放置在BOTO_CONFIG中的配置文件。您可以通过查看gsutil -D命令输出中的config_file_list变量来确认您正在引用正确的配置文件。
确保执行gsutil命令的用户可以读取引用的.boto文件
使用BOTO_CONFIG变量集运行/ path / to / gsutil允许我以另一个用户身份执行gsutil,引用使用服务帐户凭据设置的任意BOTO_CONFIG文件。
设置服务帐户:
https://console.cloud.google.com/permissions/serviceaccounts
需要下载服务帐户设置过程中的密钥文件,并在gsutil config -e步骤中请求其路径。
答案 1 :(得分:2)
访问任何云服务都需要登录Google Cloud。您需要使用以下命令,它将指导您完成登录步骤,例如通过打开控制台中提供的浏览器链接键入您生成的验证码。
gcloud auth login
答案 2 :(得分:0)
这可能是gsutil / boto如何处理Windows上的OS路径分隔符的问题,如引用here。这最终应该合并到sdk工具中,但在此之前,以下内容应该有效:
转到
谷歌-云SDK \平台\的gsutil \ THIRD_PARTY \博托\博托\ pyami \ config.py
并替换该行:
for path in os.environ['BOTO_PATH'].split(':'):
使用:
for path in os.environ['BOTO_PATH'].split(os.path.pathsep):
接下来,去吧 谷歌云-SDK \ BIN \引导\ gsutil.py
替换使用':'
的行if boto_config:
boto_path = ':'.join([boto_config, gsutil_path])
elif boto_path:
# this is ':' for windows as well, hardcoded into the boto source.
boto_path = ':'.join([boto_path, gsutil_path])
else:
path_parts = ['/etc/boto.cfg',
os.path.expanduser(os.path.join('~', '.boto')),
gsutil_path]
boto_path = ':'.join(path_parts)
与
if boto_config:
boto_path = os.path.pathsep.join([boto_config, gsutil_path])
elif boto_path:
# this is ':' for windows as well, hardcoded into the boto source.
boto_path = os.path.pathsep.join([boto_path, gsutil_path])
else:
path_parts = ['/etc/boto.cfg',
os.path.expanduser(os.path.join('~', '.boto')),
gsutil_path]
boto_path = os.path.pathsep.join(path_parts)
重新启动cmd,现在错误应该消失。