我有一台 Linode(Ubuntu 16.04),我正尝试通过调用脚本的 cron 作业将文件复制到 AWS S3 存储桶,但日志输出:
upload failed: ../path/file.ext to s3://bucket/prefix/file.ext Unable to locate credentials
脚本tar
sa 目录,然后将该 tar 上传到我的 s3 存储桶
- 如果我直接通过以下方式调用脚本,它将开始工作
sudo
- 作为 root cron 作业,它
tar
可以工作,但aws
上传不工作(出现上述错误) - 作为 [用户] cron 作业,
tar
失败(与故意的权限相关),但aws
上传成功。 - 当我安装 AWS CLI 时,我忘记了具体是如何措辞的,但我选择为所有用户安装它
我尝试过的事情
aws
我的脚本直接调用/usr/local/bin/aws
/usr/local/bin/aws
在 crontab 中以及我的脚本中添加PATH- 在 crontab 中添加
AWS_CONFIG_FILE="/home/[user]/.aws/config"
,也在我的脚本中添加 aws configure
以 root身份重新运行- 下列的这个提示,并比较 cron 和交互式环境。我的环境计划
PATH
包括我的列出的所有内容环境交互PATH
,再加上一些,甚至还有一些重复 - 这很糟糕吗?
我的环境交互(1810 行)与我的相比环境计划(36 行)。这肯定是我的环境存在差异,对吧?我搜索了我的环境交互对于 的任何实例aws
,但没有,即使该环境工作正常。有没有关于在其中寻找其他特定项目的提示?
任何想法和帮助都非常感谢!谢谢!
答案1
如果您想使用 sudo 运行特定命令user
,并从其主目录而不是您的主目录读取配置,那么您必须使用sudo -H -u user ...
sudo 运行它以自动将 HOME 变量更新为被调用的用户。
在这种情况下,这将意味着将自动生成 AWS_CONFIG_FILE 和 AWS_CREDENTIALS 的有效值。
答案2
我将.aws
目录从复制/home/[user/
到/root/
,这似乎解决了问题。
将配置文件复制到根文件夹是否存在安全或其他问题?
答案3
这里的问题是,要将文件上传到 s3,我们需要为 bash 脚本设置凭据。我遇到了同样的问题。
我以 bash 形式运行代码,一切正常。但当我添加 bash 脚本以 cron 形式运行时,同样的问题也出现在凭证上。
因此,我通过在我的 bash 脚本上提供凭据来解决这个问题,因为在运行 cron 时,它无法从aws 配置。因此,在其中添加凭据并不能解决您的问题。您可以看到以下代码作为我如何操作的示例。它对我有用。
export AWS_CONFIG_FILE="/root/.aws/config" #change it as per user
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
参考此关联了解更多信息。
但不建议在脚本中添加 aws 凭证。因此,您可以使用任何用户来配置 AWS 凭证。以该用户身份登录
sudo su - {user}
然后使用aws configure
并配置您的 AWS 凭证,添加访问密钥 ID、机密、区域等。当您尝试以 root 身份配置时,只有 root 可以使用该凭证。因此,您需要 root 才能运行 s3 副本。