authentication - 如何授权root运行gsutil?

标签 authentication authorization google-cloud-storage rsync gsutil

backup_to_gcs.sh 是一个备份脚本,它使用 gsutil rsync 将文件复制到 Google Cloud Storage。

备份脚本在用户 Wolfv(安装了 google-cloud-sdk)调用时运行:

$ /home/wolfv/scripts/backup_to_gcs/backup_to_gcs.sh
backup_to_gcs.sh in progress ...
backup_to_gcs.sh pass

到目前为止一切顺利。 但 root 需要运行 gsutil,以便可以从 Anacron 调用备份脚本。 因此,让 root 运行该脚本。

root 和 Wolfv 共享凭据是安全的,因为它们是同一个人。

root 如何运行 gsutil?

我在 Linux 上运行 gsutil 4.27。

UPDATE_1

感谢 mhouglum,root 现在可以调用备份脚本。 只需要在 root 的 .bashrc 中设置一些参数即可。 详细信息如下。

“gsutil version -l”中的两行对于用户 Wolfv 和 root 来说是不同的:

using cloud sdk
pass cloud sdk credentials to gsutil

备份脚本在用户 Wolfv 调用时运行。这是 Wolfv 数据(BOTO_CONFIG 和 BOTO_PATH 为空):

$ gsutil version -l
gsutil version: 4.27
checksum: 522455e2d24593ff3a2d3d237eefde57 (OK)
boto version: 2.47.0
python version: 2.7.13 (default, Jun 26 2017, 10:20:05) [GCC 7.1.1 20170622 (Red Hat 7.1.1-3)]
OS: Linux 4.11.11-300.fc26.x86_64
multiprocessing available: True
using cloud sdk: True
pass cloud sdk credentials to gsutil: True
config path(s): /home/wolfv/.boto, /home/wolfv/.config/gcloud/legacy_credentials/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="491b0c0d080a1d0c0d160c04080005092e24282025672a2624" rel="noreferrer noopener nofollow">[email protected]</a>/.boto
gsutil path: /home/wolfv/google-cloud-sdk/platform/gsutil/gsutil
compiled crcmod: True
installed via package manager: False
editable install: False
$ echo $BOTO_CONFIG

$ echo $BOTO_PATH

$ echo $PATH
/home/wolfv/google-cloud-sdk/bin:/home/wolfv/google-cloud-sdk/bin:/usr/lib64/qt-3.3/bin:/usr/lib64/ccache:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin

这是用户 Wolfv .bashrc:

$ cat .bashrc
# .bashrc

# after changing .bashrc, use source command to reload your .bashrc file
#   $ source "$HOME/.bashrc"
#   $ source ~/.bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

# User specific aliases and functions
export PATH=${PATH}:$HOME/scripts

# The next line updates PATH for the Google Cloud SDK.
if [ -f '/home/wolfv/google-cloud-sdk/path.bash.inc' ]; then source '/home/wolfv/google-cloud-sdk/path.bash.inc'; fi

# The next line enables shell command completion for gcloud.
if [ -f '/home/wolfv/google-cloud-sdk/completion.bash.inc' ]; then source '/home/wolfv/google-cloud-sdk/completion.bash.inc'; fi

备份脚本也会在由 root 调用时运行。这是根数据:

$ sudo -s
# gsutil version -l
gsutil version: 4.27
checksum: 522455e2d24593ff3a2d3d237eefde57 (OK)
boto version: 2.47.0
python version: 2.7.13 (default, Jun 26 2017, 10:20:05) [GCC 7.1.1 20170622 (Red Hat 7.1.1-3)]
OS: Linux 4.11.11-300.fc26.x86_64
multiprocessing available: True
using cloud sdk: False
pass cloud sdk credentials to gsutil: False
config path(s): /home/wolfv/.boto, /home/wolfv/.config/gcloud/legacy_credentials/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d082959491938495948f959d91999c90b7bdb1b9bcfeb3bfbd" rel="noreferrer noopener nofollow">[email protected]</a>/.boto
gsutil path: /home/wolfv/google-cloud-sdk/platform/gsutil/gsutil
compiled crcmod: True
installed via package manager: False
editable install: False
[0 root@localhost ~]
# echo $BOTO_CONFIG

[0 root@localhost ~]
# echo $BOTO_PATH
/home/wolfv/.boto:/home/wolfv/.config/gcloud/legacy_credentials/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2a786f6e6b697e6f6e756f676b63666a4d474b434604494547" rel="noreferrer noopener nofollow">[email protected]</a>/.boto
[0 root@localhost ~]
# echo $PATH
/usr/lib64/ccache:/sbin:/bin:/usr/sbin:/usr/bin:/home/wolfv/google-cloud-sdk/platform/gsutil:/home/wolfv/google-cloud-sdk/bin:/home/wolfv/google-cloud-sdk/platform/gsutil:/home/wolfv/google-cloud-sdk/bin

这是根.bashrc:

# cat .bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

# added by wolf so anacron can call backup script
export PATH=${PATH}:/home/wolfv/google-cloud-sdk/platform/gsutil:/home/wolfv/google-cloud-sdk/bin
export BOTO_PATH=/home/wolfv/.boto:/home/wolfv/.config/gcloud/legacy_credentials/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e8baadaca9abbcadacb7ada5a9a1a4a88f85898184c68b8785" rel="noreferrer noopener nofollow">[email protected]</a>/.boto

# The next line updates PATH for the Google Cloud SDK.
#if [ -f '/home/wolfv/google-cloud-sdk/path.bash.inc' ]; then source '/home/wolfv/google-cloud-sdk/path.bash.inc'; fi

# The next line enables shell command completion for gcloud.
#if [ -f '/home/wolfv/google-cloud-sdk/completion.bash.inc' ]; then source '/home/wolfv/google-cloud-sdk/completion.bash.inc'; fi

UPDATE_2

终端上的 root 和 anacron 都可以运行备份脚本。
当 root 运行脚本时,GCS 上的文件会更新;很好。
anacron运行脚本时,返回错误代码127;不好。

使用名为 ls.sh 的简单脚本重现该行为:

#!/bin/bash

LOG_FILE="/home/wolfv/scripts/test/ls.log"

echo "I am $(whoami). date=$(date)" >> "$LOG_FILE"

gsutil ls >> "$LOG_FILE"
errorCode=$?

echo "errorCode=$errorCode" >> "$LOG_FILE"

root 从终端调用脚本:

# /home/wolfv/scripts/test/ls.sh

ls.log 中的结果:

I am root. date=Mon Aug 14 05:21:23 MDT 2017
gs://wolfv/
gs://wolfv2/
gs://wolfvtest/
errorCode=0

anacron 调用脚本:

# anacron -n -f ls_id

ls.log 中的结果:

I am root. date=Mon Aug 14 05:21:38 MDT 2017
errorCode=127

什么原因导致错误代码 127?

UPDATE_3

我重复了 UPDATE_2 中的测试,但使用 cron 而不是 anacron。 结果与 cron 类似,得到相同的 errorCode=127。

wolfv 从终端调用脚本:

$ /home/wolfv/scripts/test/ls.sh

ls.log 中的结果:

I am wolfv. date=Fri Aug 18 20:58:57 MDT 2017
gs://wolfv/
gs://wolfv2/
gs://wolfvtest/
errorCode=0

cron 调用脚本:

$ crontab -l
#test gsutil on cron
*/10 * * * * /home/wolfv/scripts/test/ls.sh

ls.log 中的结果:

I am wolfv. date=Fri Aug 18 21:20:01 MDT 2017
errorCode=127

gsutil 脚本从终端运行良好,但不能从 cron/anacron 运行。
什么可能导致 cron 和 anacron 返回错误代码 127?

最佳答案

运行sudo -s后,检查所有内容是否设置为您期望的值:

  • echo $BOTO_CONFIG 是否显示正确的 boto 文件?如果没有,也许 root 的 .bashrc 没有被获取?
  • echo $PATH 是否包含您添加的 gsutil 目录?
  • 当您运行 gsutil version -l 时,您应该会看到:
    • 配置路径标签,后跟/home/wolfv/.boto
    • gsutil 路径 标签,后跟 /home/wolfv/google-cloud-sdk/platform/gsutil/gsutil。如果情况并非如此,则可能有一个 gsutil 可执行文件出现在您附加的 gsutil 目录之前的 PATH 中,并且您可能需要尝试添加 gsutil 目录到您的 PATH 以便首先找到它,例如导出 PATH=/home/wolfv/google-cloud-sdk/platform/gsutil:${PATH}

如果以 root 身份看起来一切正常,您可以以您自己和 root 的身份运行 gsutil version -l 并比较输出,让您了解这些环境之间的配置有所不同。

编辑:

下面的评论的TL;DR是:如果您尝试加载超过1个boto配置文件,您应该取消设置BOTO_CONFIG(它只需要1个文件路径),然后使用BOTO_PATH 环境变量,它允许指定多个文件路径,这些路径由系统上的 os.pathsep 计算结果分隔(Linux 上为 : >;(在 Windows 上)。

关于authentication - 如何授权root运行gsutil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45527330/

相关文章:

php - password_verify() 总是返回 false

session - 使用 ColdFusion 创建持久登录系统

node.js - REST API - 如何实现用户特定授权?

python - Google Cloud Storage - 将文件从一个文件夹移动到另一个文件夹 - 使用 Python

c# - 在 C# 中将对象上传到谷歌云存储桶

python - Scrapy - 抓取的网站身份验证 token 在抓取时过期

javascript - 验证 POST 请求

java - 在 tomcat 管理器中,如何限制用户只能部署/取消部署特定应用程序?

java - Java 中的 SonarQube Web API 身份验证

firebase - 如何使用生产存储桶数据启动 Firebase 存储模拟器?