EC2实例上的PHP exec bash脚本

时间:2018-12-28 04:41:19

标签: php bash amazon-web-services amazon-ec2

我已经苦苦挣扎了三天,以使用php执行bash脚本。设置如下: php in local machine ---> using aws sdk for php ---> starts an ec2 instance. -有效。发布ec2实例运行后,我正在使用

exec("bash /var/www/html/pushDatToAWS.sh")

此bash文件在我的本地计算机上,具有777权限,并由user:www-data拥有。为了向PHP提供AWS凭证,我正在使用以下代码:

config.php

<?php
define("KEY",'abcde');
define("SECRET:,'secret');
define("REGION",'region');
define("VERSION" ,'version');
?>

connectToAWS.php

require('config.php');
require 'vendor/autoload.php';
use Aws\Ec2\Ec2Client;

$ec2Client = new Ec2Client([
    'region' => REGION,
    'version' => '2016-11-15',
    'credentials' => [
        'key'    => KEY,
        'secret' => SECRET
    ],
]);

$action = 'START';

$instanceIds = array('i-abcde');

if ($action == 'START') {
    $result = $ec2Client->startInstances(array(
        'InstanceIds' => $instanceIds,
    ));
} else {
    $result = $ec2Client->stopInstances(array(
        'InstanceIds' => $instanceIds,
    ));
}

此代码正常工作。我能够连接到AWS并启动实例。启动实例后,我试图执行失败的bash脚本。

exec("bash /var/www/html/pushDatToAWS.sh >> $trainLog");

pushDatToAWS.sh

ipad='12.345.543.21'

while true; do
    echo "Checking for Working directory status"
    ssh -i /var/www/html/IRISONTHECLOUD_OREGON.pem ubuntu@$ipad "bash /home/ubuntu/irisbuilder/checkWorkingDir.sh $dirName" 
    if [ $? -eq 0 ]
    then
        echo 'Working directory status check complete'
        break
    fi
    sleep 1
    echo -n 
done

pem文件已修改为400,并由username:www-data拥有。但是,我得到了错误:

Load key "/var/www/html/IRISONTHECLOUD_OREGON.pem": Permission denied
ubuntu@12.345.543.21: Permission denied (publickey).

我找到了一个AWS开发人员博客,内容涉及类似问题here。按照开发人员的建议,我在pushDatToAWS.php

中添加了以下内容
putenv('AWS_DEFAULT_REGION=' . REGION);
putenv('AWS_ACCESS_KEY_ID=' . KEY);
putenv('AWS_SECRET_ACCESS_KEY=' . SECRET);

在调用exec(bash ...)之前。我一直在尝试各种选择,但我无法使用php触发bash脚本。有人可以给我一个可行的例子。我什至尝试对php文件中的密钥和机密进行硬编码,但仍然无法启动ec2实例。但是,当我从终端手动执行该脚本时,整个bash脚本都能完美运行。

2 个答案:

答案 0 :(得分:1)

如您所述,您的问题位于此处:

Load key "/var/www/html/IRISONTHECLOUD_OREGON.pem": Permission denied

您说您的脚本以“ user:www-data”身份运行,PEM文件权限为“ username:www-data” 400?我猜有一个错字,并且都为同一用户设置了( username!= user )。

您的bash脚本似乎可以运行,因此目录级权限似乎允许列出“ / var / www / html /”目录的内容。

下一个最佳猜测是将PEM文件从“ / var / www”之外的目录移动到“ / var / www / html /”目录,该目录保留了原始目录的SELinux标签。这可能会阻止您的WebServer进程读取PEM文件。您可以通过将PEM文件SELinux标签与其所在目录进行比较来进行检查:

ls -laZ /var/www/html/IRISONTHECLOUD_OREGON.pem
ls -laZ /var/www/html

然后,如果它是错误的SELinux标签,则只需引用“ / var / www / html”目录即可设置PEM文件SELinux标签:

chcon -R --reference=/var/www/html /var/www/html/IRISONTHECLOUD_OREGON.pem

如果这确实可以解决您的问题,那么您还应该考虑更改此SELinux标签对于此SSH密钥的安全性意味着什么(例如,其他正在运行的脚本服务器)

答案 1 :(得分:0)

我只是发布此答案来完成此问题,并相信对于第一个测试这些工具的人可能会派上用场。

要从本地PHP文件在EC2实例上运行bash脚本,需要执行以下操作:

  1. 无论您在拥有pem文件的任何地方,都将文件所有权提供给www-data:www:data
  2. 将Mod级别更改为400
  3. 使用适用于PHP的AWS开发工具包。文档中给出的基本代码(也在此处存在问题)可以正常工作。
  4. 建立启动aws实例后,请使用bash脚本运行所有程序。