使用 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 终止正在运行的子进程