如何设置gsutil从Anacron运行?

时间:2017-03-07 06:33:04

标签: google-cloud-storage gsutil

作为用户,gsutil工作得很好。 从crontab(用户)调用时,gsutil工作得很好。

作为root用户,gsutil说:

Caught non-retryable exception while listing gs://....: ServiceException: 401 Anonymous users does not have storage.objects.list access to bucket ...."

从Anacron(root)调用时,gsutil不起作用。 从Anacron调用的其他脚本运行良好。

〜/ .boto文件包含凭据,位于用户HOME目录中。 所以也许这会引起异常。

我尝试设置BOTO_CONFIG,但它没有改变结果:

$ gsutil -D ls 2>&1 | grep config_file_list 
config_file_list: ['/home/wolfv/.boto']
$ sudo gsutil -D ls 2>&1 | grep config_file_list 
config_file_list: []
$ BOTO_CONFIG="/root/.boto"
$ sudo gsutil -D ls 2>&1 | grep config_file_list 
config_file_list: []

如何设置gsutil从Anacron运行?

$ gsutil -D
gsutil version: 4.22
checksum: 2434a37a663d09ae21d1644f64ce60ca (OK)
boto version: 2.42.0
python version: 2.7.13 (default, Jan 12 2017, 17:59:37) [GCC 6.3.1 20161221 (Red Hat 6.3.1-1)]
OS: Linux 4.9.11-200.fc25.x86_64
multiprocessing available: True
using cloud sdk: True
config path: /home/wolfv/.boto
gsutil path: /home/wolfv/Downloads/google-cloud-sdk/platform/gsutil/gsutil
compiled crcmod: True
installed via package manager: False
editable install: False
Command being run: /home/wolfv/Downloads/google-cloud-sdk/platform/gsutil/gsutil -o GSUtil:default_project_id=redacted -D
config_file_list: ['/home/wolfv/.config/gcloud/legacy_credentials/redacted/.boto', '/home/wolfv/.boto']
config: [('debug', '0'), ('working_dir', '/mnt/pyami'), ('https_validate_certificates', 'True'), ('debug', '0'), ('working_dir', '/mnt/pyami'), ('content_language', 'en'), ('default_api_version', '2'), ('default_project_id', 'redacted')]

UPDATE_1

导出BOTO_CONFIG为终端工作:

$ sudo -s
[root] # export BOTO_CONFIG=/home/wolfv/.boto
[root] # gsutil -D ls 2>&1 | grep config_file_list
config_file_list: ['/home/wolfv/.boto']

[root] # vi /root/.bashrc
add this line to end of .bashrc:
export BOTO_CONFIG=/home/wolfv/.boto
exit

open new terminal and test the new BOTO_CONFIG in bash.rc
$ sudo -s
[root] # gsutil -D ls 2>&1 | grep config_file_list
config_file_list: ['/home/wolfv/.boto']
exit

不幸的是,在/root/.bashrc中输出BOTO_CONFIG并没有帮助Anacron调用gsutil。 备份日志显示Anacron调用了备份脚本,并且对gsutil的备份脚本调用失败。

哪个初始化脚本设置路径BOTO_CONFIG是否重要? 要使Anacron(root)永久可以访问该路径,应在哪个文件中设置BOTO_CONFIG?:

/etc/profile
/root/.bash_profile
/root/.bashrc

UPDATE_2

我的凭据现在很复杂,可能来自我所做的一些改变。 以下是我对houglum对BOTO_CONFIG的建议的尝试。

首先授权登录以解决问题:

$ gcloud auth login
Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?redirect_uri=http%3A%2F%2Flocalhost%3A8085%2F&prompt=select_account&response_type=code&client_id=redacted.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fappengine.admin+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcompute+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Faccounts.reauth&access_type=offline


Created new window in existing browser session.
WARNING: `gcloud auth login` no longer writes application default credentials.
If you need to use ADC, see:
  gcloud auth application-default --help

You are now logged in as [edacted].
Your current project is [redacted].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID

内联定义BOTO_CONFIG不起作用:

$ BOTO_CONFIG=/home/wolfv/.boto gsutil ls
Your credentials are invalid. Please run
$ gcloud auth login

导出BOTO_CONFIG不起作用:

$ export BOTO_CONFIG=/home/wolfv/.boto; gsutil ls
Your credentials are invalid. Please run
$ gcloud auth login

采购bashrc不起作用:

$ ls /home/wolfv/.bashrc
/home/wolfv/.bashrc
$ . /home/wolfv/.bashrc; gsutil ls
Your credentials are invalid. Please run
$ gcloud auth login

UPDATE_3

如果我从.boto中删除我的凭据,并使用身份验证登录(基于Your credentials are invalid. Please run $ gcloud auth login

,我的凭据会有效
$ gcloud auth login redacted@email.com
WARNING: `gcloud auth login` no longer writes application default credentials.
If you need to use ADC, see:
  gcloud auth application-default --help

You are now logged in as [redacted@email.com].
Your current project is [redacted-123].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID

使用auth登录后,gsutil在终端上工作:

$ gsutil ls
gs://redacted/
gs://redacted/
gs://redacted/

调用gsutil的备份脚本也可以在终端上运行:

$ ~/scripts/backup_to_gcs/backup_to_gcs.sh
backup_to_gcs.sh in progress ...
backup_to_gcs.sh completed successfully    

但是,从crontab调用时,backup_to_gcs.sh失败。

如何从crontab运行gsutil?

UPDATE_4

这是在我的anacron文件中:

1       10        anacron_test_id   BOTO_PATH=/home/wolfv/.config/gcloud/legacy_credentials/wolfvolpi@gmail.com/.boto:/home/wolfv/.boto /home/wolfv/scripts/backup_to_gcs/backup_to_gcs.sh

anacron按预期运行backup_to_gcs.sh脚本,但备份失败。 从命令行调用backup_to_gcs.sh脚本时,它可以正常工作。

可能是因为gsutil以用户身份运行,但不以root身份运行:

$ gsutil ls
gs://wolfv/
gs://wolfv-test-log/
gs://wolfv2/
gs://wolfvtest/
$ BOTO_PATH=/home/wolfv/.config/gcloud/legacy_credentials/wolfvolpi@gmail.com/.boto:/home/wolfv/.boto gsutil ls
gs://wolfv/
gs://wolfv-test-log/
gs://wolfv2/
gs://wolfvtest/
$ sudo BOTO_PATH=/home/wolfv/.config/gcloud/legacy_credentials/wolfvolpi@gmail.com/.boto:/home/wolfv/.boto gsutil ls
sudo: gsutil: command not found
$ sudo gsutil ls
sudo: gsutil: command not found

两天前root可以运行gsutil了。 从那时起,我使用dnf history rollback来卸载不同的软件。 这会影响gsutil身份验证吗?

UPDATE_5

我按照https://cloud.google.com/storage/docs/authentication#gsutilauth上的说明操作 使用服务帐户

$ gcloud auth activate-service-account --key-file=/home/wolfv/REDACTED.json

已激活的服务帐户凭据:[REDACTED@appspot.gserviceaccount.com]

但是,root仍无法运行gsutil:

$ sudo gsutil ls
sudo: gsutil: command not found

$ gsutil ls -la gs://wolfvtest/test_lifecycle/
CommandException: You have multiple types of configured credentials (['Oauth 2.0 User Account', 'OAuth 2.0 Service Account']), which is not supported. One common way this happens is if you run gsutil config to create credentials and later run gcloud auth, and create a second set of credentials. Your boto config path is: ['/home/wolfv/.boto', '/home/wolfv/.config/gcloud/legacy_credentials/my-project@appspot.gserviceaccount.com/.boto']. For more help, see "gsutil help creds".

帮助指的是不再提及“auth”https://developers.google.com/cloud/sdk/gcloud/#gcloud.auth

的网页

所以我有太多凭证:

$ gsutil -D
...
config_file_list: ['/home/wolfv/.boto', '/home/wolfv/.config/gcloud/legacy_credentials/my-project@appspot.gserviceaccount.com/.boto']

root(foracron)是否使用了这些凭据? 它们不在根目录中。 anacron所需的信用证应该在根目录中吗?

UPDATE_5 我在How to authorize root to run gsutil?

上安装Fedora 26后再次尝试

1 个答案:

答案 0 :(得分:2)

在shell中执行BOTO_CONFIG=<value>时,您实际上并未定义环境变量,而是定义本地shell变量(有关详细信息,请参阅this thread)。您希望使用以下命令内联定义变量:

BOTO_CONFIG=/path/to/config gsutil ls

或首先导出BOTO_CONFIG环境变量,然后运行gsutil命令:

export BOTO_CONFIG=/path/to/config; gsutil ls

编辑:

我刚才注意到,除了您自己的$ HOME / .boto文件外,您还依赖于从gcloud auth login设置的gcloud凭据。当你运行它时,gcloud会为你创建另一个.boto文件,当你从gcloud的包装器脚本运行gsutil时,它首先加载.boto文件,然后加载你指定的任何.boto文件。 BOTO_CONFIG或BOTO_PATH环境变量。

如果你想以root身份运行(cron作业所做的)并使用这两个.boto文件,你需要使用BOTO_PATH变量来列出它们,用冒号分隔,同时确保BOTO_CONFIG未设置环境变量(BOTO_CONFIG优先于BOTO_PATH ... the gsutil docs mention this briefly):

BOTO_PATH=/home/wolfv/.config/gcloud/legacy_credentials/REDACTED/.boto:/home/wolfv/.boto gcloud ls

编辑2:

1)当您收到错误&#34; sudo:gsutil:command not found&#34;时,表示root用户无法在其PATH中找到gsutil可执行文件。您应该使用gsutil可执行文件的绝对路径 - 从帖子中看,它看起来像/home/wolfv/Downloads/google-cloud-sdk/platform/gsutil/gsutil

2)当您激活服务帐户凭据时,gsutil的gcloud包装器将创建一个单独的.boto文件(路径包含legacy_credentials/myproject@appspot[...]),如果它存在,则更喜欢使用此文件。它包含属性gs_service_key_file,而您的其他.boto文件可能包含gs_oauth2_refresh_token - 加载具有多个凭据属性的多个.boto文件会导致您看到错误。

如果您想使用gcloud来管理您的身份验证凭据,通常不应该在[Credentials]文件的$HOME/.boto部分下放置任何内容。