繁体   English   中英

EC2实例上的PHP exec bash脚本

[英]PHP exec bash script on ec2 instance

我已经苦苦挣扎了三天,以使用php执行bash脚本。 设置如下: php in local machine ---> using aws sdk for php ---> starts an ec2 instance. - 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开发人员博客,谈论类似的问题。 按照开发人员的建议,我在pushDatToAWS.php添加了以下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脚本都能完美运行。

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

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

您说您的脚本以“ user:www-data”身份运行,PEM文件权限为“ username:www-data” 400? 我猜有一个错字,并且都为同一用户( 用户名!= 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密钥的安全性意味着什么 (例如,服务器上运行的其他脚本)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM