我正在尝试使用shell exec从php代码中运行aws s3 cp命令。以下是php代码。
echo shell_exec("sudo aws s3 cp s3://<bucket>/somefolder/somefile s3://<bucket>/someotherfolder/somefile --region ap-southeast-1 --acl public-read");
文件未被复制,echo的输出如下
“无法找到凭据已完成1个部分,其中包含...文件”
注1:我已使用aws configure命令设置凭据
注2:如果我直接从终端运行完全相同的命令,它可以正常工作。
有什么想法吗?
答案 0 :(得分:2)
AWS CLI在〜/ .aws / config设置凭据,aws php sdk在〜/ .aws / credentials中查找它们。
所以:
cd ~/.aws
mv config credentials
解决了我认为对我来说同样的问题。
答案 1 :(得分:2)
这对我有用:
<?php
putenv('AWS_DEFAULT_REGION=your-region');
putenv('AWS_ACCESS_KEY_ID=YOURACCESSKEYID');
putenv('AWS_SECRET_ACCESS_KEY=YOURSECRETACCESSKEY');
$output = shell_exec('aws s3 cp ./file.txt s3://MYBUCKETID/ 2>&1');
echo "<pre>$output</pre>";
?>
答案 2 :(得分:1)
然后,您可以在终端上运行:
$ cat ~/.aws/config
[profile eb-cli]
aws_access_key_id = XXXXXX
aws_secret_access_key = XXXXXX
$ aws configure
然后会要求您输入4个值:
- 访问密钥ID(访问密钥) - 这是两个值中较短的一个。
- 秘密访问密钥
- 默认区域名称(输入'us-east-1')
- 输出格式(输入'json')
醇>
然后
$ aws s3 sync s3://<bucketname>
答案 3 :(得分:0)
看起来像配置文件的权限/位置问题。
使用AWS CLI设置的凭据是在当前用户的路径中的特殊文件中编写的。 PHP我想是在执行其他权限(而不是同一个用户)。我建议您将配置保存在单独的文件中并传递给CLI this way。您还需要确保PHP shell_exec中的特定环境变量可用。
答案 4 :(得分:0)
扩展user1464317:
我发现Yosemite vs Mavericks存在这个问题。适用于Mavericks的AWS CLI在&#34;〜/ .aws / config&#34;中查找权限,其中Yosemite查找&#34;〜/ .aws / credentials&#34;。
如果使用cron,可以在crontab -e中设置环境变量,如下所示:
# Mavericks
AWS_CONFIG_FILE="/Users/YOUR_USER/.aws/config"
# Yosemite
AWS_CONFIG_FILE="/Users/YOUR_USER/.aws/credentials"
或者您执行user1464317暗示,将文件移到:
mv config credentials
答案 5 :(得分:0)
为了解决该问题,请执行以下步骤: