12

我正在尝试使用 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:如果我直接从终端运行完全相同的命令,它工作正常。

任何想法?

4

6 回答 6

3

这对我有用:

<?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>";

?>

于 2020-02-06T16:05:59.273 回答
2

AWS CLI 在 ~/.aws/config 中设置凭证,而 aws php sdk 在 ~/.aws/credentials 中查找它们。

所以:

cd ~/.aws
mv config credentials

解决了我认为对我来说同样的问题。

于 2014-09-27T19:30:43.923 回答
2

然后,您可以从您的终端运行:

$ cat ~/.aws/config
[profile eb-cli]
aws_access_key_id = XXXXXX
aws_secret_access_key = XXXXXX

$ aws configure

然后您将被要求输入 4 个值:

  1. 访问密钥 ID (Access Key) - 这是两个值中较短的一个。
  2. 秘密访问密钥
  3. 默认区域名称(输入“us-east-1”)
  4. 输出格式(输入“json”)

然后

$ aws s3 sync s3://<bucketname>
于 2016-02-08T20:35:24.970 回答
0

要扩展 user1464317:

我发现优胜美地 vs 小牛队存在这个问题。适用于 Mavericks 的 AWS CLI 在“~/.aws/config”中查找权限,而 Yosemite 在“~/.aws/credentials”中查找。

如果使用 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
于 2014-12-17T16:34:34.510 回答
0

看起来像配置文件的权限/位置问题。

使用 AWS CLI 设置的凭证被写入当前用户路径中的特殊文件中。我猜PHP是在其他权限下执行的(不是同一个用户)。我建议您应该将配置保存在单独的文件中并以这种方式传递给 CLI 。您还需要确保特定环境变量在 PHP shell_exec 中可用。

于 2014-02-22T15:24:22.987 回答
0

为了解决此问题,请执行以下步骤:

  1. 将 .aws 目录从 /home/non-rootUser/.aws 复制到 /var/www
  2. 现在将目录更改为 /var/www (cd /var/www)
  3. 更改权限:/www$ sudo chmod -R 755 .aws
  4. 更改所有权 /www$ sudo chown -R $USER:$USER .aws
  5. 重新检查
于 2018-10-03T06:30:18.973 回答