【问题标题】:Can't upload file to GCS using gsutil无法使用 gsutil 将文件上传到 GCS
【发布时间】:2014-09-05 00:45:18
【问题描述】:

正在复制文件://InstreamImpression.csv.gz [Content-Type=application/octet-stream]...

AccessDeniedException:401 需要登录fe13d1e0fb408639_4...:46.75 MB/46.77 MB

CommandException: 1 个文件/对象无法传输。

似乎整个对象正在传输,但最后给出 401 错误。这已经发生了一段时间。

运行“gcloud auth login”几次。但是还是一样的错误

我可以从不同的机器上传文件。

有什么想法吗?

【问题讨论】:

  • 您使用的是服务帐号吗?它还不能通过 Cloud SDK 使用,但您可以同时尝试googleapis.com/storage/v1/b/prerelease/o/…
  • 我认为这里发生的情况是 gcloud auth login 为您提供了 gcloud 客户端 ID 的令牌,但您使用的是使用 gsutil 客户端 ID 的独立版本(甚至就像我之前链接的预发行版) .当您的访问令牌需要刷新时,这将失败。解决方案是仅使用 gcloud 分发的 gsutil,或者卸载 gcloud 并使用独立 gsutil 版本运行 gsutil 配置。这绝对是痛苦的,gsutil 开发人员希望尽快改进。

标签: google-cloud-storage gsutil


【解决方案1】:

这是一个奇怪的案例。

该文件位于“D:”驱动器下的 Windows 服务器上,我正在从那里运行 gsutil 工具。

即 D:>gsutil -m cp xyz.csv gs:\somebucket\

我在 D: 驱动器上没有足够的权限

但只要我从“C:”驱动器运行相同的命令,它就可以正常工作

即 C:>gsutil -m cp "D:\xyz.csv" gs:\somebucket\

【讨论】:

    【解决方案2】:

    这可能是 gsutil/boto 如何处理 Windows 上的操作系统路径分隔符的问题,如引用 here。这最终应该会合并到 sdk 工具中,但在此之前应该可以使用以下方法:

    前往
    google-cloud-sdk\platform\gsutil\third_party\boto\boto\pyami\config.py

    并替换该行:

    for path in os.environ['BOTO_PATH'].split(':'):
    

    与:

    for path in os.environ['BOTO_PATH'].split(os.path.pathsep):
    

    接下来,前往
    google-cloud-sdk\bin\bootstrapping\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,错误就会消失。

    【讨论】:

      猜你喜欢
      • 2020-12-10
      • 2018-12-18
      • 2018-06-14
      • 2019-10-26
      • 2021-10-09
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多