作为用户,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后再次尝试答案 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
部分下放置任何内容。