如何授权 root 到 运行 gsutil?
How to authorize root to run gsutil?
backup_to_gcs.sh 是一个备份脚本,它使用 gsutil rsync 将文件复制到 Google Cloud Storage。
当用户 wolfv(安装 google-cloud-sdk)调用时备份脚本 运行s:
$ /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/REDACTED_EMAIL@gmail.com/.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 调用时 运行s。这是根数据:
$ 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/REDACTED_EMAIL@gmail.com/.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/REDACTED_EMAIL@gmail.com/.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/REDACTED_EMAIL@gmail.com/.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 运行s 脚本时,文件在 GCS 上更新;不错。
当 anacron 运行s 脚本时,它 returns 错误代码 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 return 错误代码 127?
一旦您 运行 sudo -s
,请检查是否所有内容都设置为您期望的值:
echo $BOTO_CONFIG
是否显示了正确的 boto 文件?如果不是,也许 root 的 .bashrc 没有被获取?
echo $PATH
是否包含您添加的 gsutil 目录?
- 当您 运行
gsutil version -l
时,您应该看到:
config path(s)
标签,后跟/home/wolfv/.boto
gsutil path
标签,后跟 /home/wolfv/google-cloud-sdk/platform/gsutil/gsutil
。如果不是这种情况,则可能有一个 gsutil 可执行文件显示在您的 PATH before 您附加的 gsutil 目录之前,您可能想尝试 prepending 将 gsutil 目录添加到您的 PATH,以便首先找到它,例如export PATH=/home/wolfv/google-cloud-sdk/platform/gsutil:${PATH}
.
如果作为 root 一切看起来都很好,您可以 运行 gsutil version -l
作为您自己和作为 root 并比较输出,让您看到这些环境之间的配置不同。
编辑:
下面评论的 TL;DR 是:如果你试图加载超过 1 个 boto 配置文件,你应该取消设置 BOTO_CONFIG
(它只需要 1 个文件路径),而是使用BOTO_PATH
环境变量,它允许指定多个文件路径,这些文件路径由 os.pathsep
在您的系统上的计算结果分隔(:
在 Linux,;
在 Windows).
backup_to_gcs.sh 是一个备份脚本,它使用 gsutil rsync 将文件复制到 Google Cloud Storage。
当用户 wolfv(安装 google-cloud-sdk)调用时备份脚本 运行s:
$ /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/REDACTED_EMAIL@gmail.com/.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 调用时 运行s。这是根数据:
$ 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/REDACTED_EMAIL@gmail.com/.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/REDACTED_EMAIL@gmail.com/.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/REDACTED_EMAIL@gmail.com/.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 运行s 脚本时,文件在 GCS 上更新;不错。
当 anacron 运行s 脚本时,它 returns 错误代码 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 return 错误代码 127?
一旦您 运行 sudo -s
,请检查是否所有内容都设置为您期望的值:
echo $BOTO_CONFIG
是否显示了正确的 boto 文件?如果不是,也许 root 的 .bashrc 没有被获取?echo $PATH
是否包含您添加的 gsutil 目录?- 当您 运行
gsutil version -l
时,您应该看到:config path(s)
标签,后跟/home/wolfv/.boto
gsutil path
标签,后跟/home/wolfv/google-cloud-sdk/platform/gsutil/gsutil
。如果不是这种情况,则可能有一个 gsutil 可执行文件显示在您的 PATH before 您附加的 gsutil 目录之前,您可能想尝试 prepending 将 gsutil 目录添加到您的 PATH,以便首先找到它,例如export PATH=/home/wolfv/google-cloud-sdk/platform/gsutil:${PATH}
.
如果作为 root 一切看起来都很好,您可以 运行 gsutil version -l
作为您自己和作为 root 并比较输出,让您看到这些环境之间的配置不同。
编辑:
下面评论的 TL;DR 是:如果你试图加载超过 1 个 boto 配置文件,你应该取消设置 BOTO_CONFIG
(它只需要 1 个文件路径),而是使用BOTO_PATH
环境变量,它允许指定多个文件路径,这些文件路径由 os.pathsep
在您的系统上的计算结果分隔(:
在 Linux,;
在 Windows).