使用 python 子进程在实例上运行 gsutil - 访问权限?

Posted

技术标签:

【中文标题】使用 python 子进程在实例上运行 gsutil - 访问权限?【英文标题】:Running gsutil on instance using python subprocess - access permissions? 【发布时间】:2019-05-03 22:08:36 【问题描述】:

我有一个在谷歌计算引擎实例上进行计算的 python 脚本。该代码在进行计算方面工作正常,但在代码中的某些点,它需要从云存储桶中添加/删除文件,我使用 gsutil 执行此操作。这在我的本地计算机上运行时效果很好,但在从谷歌云实例运行相同的代码时不起作用。通过“不工作”在违规行报告错误消息,但我的代码继续运行并忽略涉及 gsutil 的步骤。

我对 Google 文档的理解是 gcloud 实例启动时已安装了“gsutil”实用程序。我的实例启动运行这样的脚本(我的实际谷歌用户名在哪里):

#! /bin/bash

sudo apt-get update
sudo apt-get -yq install python-pip
sudo pip install --upgrade google-cloud
sudo pip install --upgrade google-cloud-storage
sudo pip install --upgrade google-api-python-client
sudo pip install --upgrade google-auth-httplib2

mkdir -p /home/<xxxx>/code
mkdir -p /home/<xxxx>/rawdata
mkdir -p /home/<xxxx>/processeddata
sudo chown -R <xxxx> /home/<xxxx>

gsutil cp gs://<codestorebucket>/worker-python-code/* /home/<xxxx>/code/
gsutil -m cp gs://<rawdatabucket>/* /home/<xxxx>/rawdata/

我还没有从启动脚本运行我的代码,因为我想“SSH”到实例中并在我仍在开发时从命令行自己运行它。当我进入实例时,所有目录都已创建,所有代码和原始数据文件都已复制。我可以运行我的“.py”文件并且它运行,但是有些行使用了 python 命令:

subprocess.call('gsutil -q rm gs://<mybuckname>/<myfilename>', shell=True)

这会产生一个错误,内容如下:

ERROR: (gsutil) Failed to create the default configuration. Ensure your have the correct permissions on: [/home/<xxxx>/.config/gc
loud/configurations].
  Could not create directory [/home/<xxxx>/.config/gcloud/configurations]: Permission denied.

如果它提供任何线索,在“daemon.log”文件中有一条错误行,内容如下:

chown: invalid user: ‘<xxxxx>’

sudo chown... 命令行运行时报告。

实例拥有对所有 API 的完全访问权限。如果我跑

whoami

响应是“xxxxx”。如果我运行

echo $UID

响应为 1000。

我是 Linux 新手,因为我只是通过需要在 google 实例上做一些事情来“了解”它。有一个链接here 用户似乎有类似的问题。他使用 sudo chown 类型的命令行修复它,但是当我运行等效命令时,我被告知它“无法访问'/home/paulgarlick07/.config/':没有这样的文件或目录”

我真的很困惑,非常感谢任何帮助。如果需要任何其他信息来帮助解决此问题,请告诉我!

【问题讨论】:

您能否分享重现该问题所需的最少 Python 代码? 嗨格言。重现此问题的最少步骤是:1) 创建一个名为 tester123 的存储桶并向其中添加一个空白 test.csv 文件 2) 创建一个 demo.py 文件,其中仅包含“import subprocess”和“subprocess.call(' gsutil -q rm gs://tester/test.csv', shell=True)"。 3) 创建一个没有任何启动脚本的新实例。 4) SSH 进入实例,将 demo.py 复制到某个地方。 5)使用“python demo.py”运行python文件。错误消息现在是“AccessDeniedException: 403 Insufficient OAuth2 Scope....”,即使从存储桶中复制数据工作正常! 我建议我们的产品团队you report 这种行为,以帮助进一步调查此问题。 Google 会确保为您提供帮助。 【参考方案1】:

gsutil 不是程序。这是一个脚本。因此,您需要使用 gsutil 作为命令行参数来执行 shell。您需要传递 gsutil 的完整路径名,这可能在您的系统上有所不同。

subprocess.call('/bin/sh /usr/bin/gsutil -q rm gs://<mybuckname>/<myfilename>', shell=True)

如果您从服务运行 gsutil,则需要确保运行该服务的用户具有 gsutil 设置。 gsutil 根据正在执行的用户的主目录存储其配置文件。

【讨论】:

以上是关于使用 python 子进程在实例上运行 gsutil - 访问权限?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Windows 上使用 Python 终止正在运行的子进程

始终并行运行恒定数量的子进程

并行运行多个子进程 - python 2.7

在Flask中运行python子进程

python子进程模块subprocess详解与应用实例 之二

Python子进程显示在终端上登录并保存在文件中