gsutil AccessDeniedException:401需要登录

时间:2015-02-14 18:18:28

标签: google-cloud-storage gsutil

所以我运行以下内容:

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并运行了配置。

3 个答案:

答案 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变量中引用此文件。如果没有,请参阅下面的内容进行更改。

在服务帐户或其他用户

下运行gsutil

如果您作为另一个用户运行,并且需要引用新创建的配置文件,请设置环境变量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,现在错误应该消失。