PHP exec bash скрипт на экземпляре ec2 - PullRequest
0 голосов
/ 28 декабря 2018

Я три дня пытался выполнить bash-скрипт с использованием php.Настройка выглядит следующим образом: 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.Для предоставления учетных данных aws в PHP я использую следующий код:

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

putenv('AWS_DEFAULT_REGION=' . REGION);
putenv('AWS_ACCESS_KEY_ID=' . KEY);
putenv('AWS_SECRET_ACCESS_KEY=' . SECRET);

перед вызовом exec(bash ...).Я пробовал различные варианты, которые я потерял счет, но я не мог запустить скрипт bash с помощью php.Может ли кто-нибудь привести мне работоспособный пример.Я даже пытался жестко запрограммировать ключ и секрет в php-файле, но все равно не работал, кроме инициации экземпляра ec2.Однако весь скрипт bash отлично работает, когда я запускаю его вручную из терминала.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Я просто отправляю этот ответ, чтобы завершить этот вопрос, и считаю, что он может пригодиться тому, кто впервые тестирует эти инструменты.

Запуск сценария bash на экземпляре EC2 из локального файла PHPнужно выполнить следующее:

  1. , где бы у вас ни был файл pem, предоставьте право собственности на файл www-data: www: data
  2. измените уровень мода на 400
  3. используйте AWS SDK FOR PHP.Основной код, приведенный в документации (также в данном вопросе), работает без проблем.
  4. После того, как вы установили, инициировали экземпляр aws, используйте скрипт bash для запуска всех ваших программ.
0 голосов
/ 28 декабря 2018

Как вы заметили, ваша проблема находится здесь:

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

Вы сказали, что ваш скрипт работает как "user: www-data", а разрешения файла PEM 400 для "username:"WWW-данные "?Я предполагаю, что есть опечатка, и оба установлены для одного и того же пользователя ( username! = User ).

Ваш скрипт bash, похоже, может быть запущен, поэтому уровень каталогапохоже, что разрешения разрешают перечислять содержимое каталога "/ var / www / html /".

Следующим лучшим предположением является то, что вы переместили PEM-файл из каталога вне "/ var / www" в "/ var/ www / html / "каталог, в котором сохранены метки SELinux исходного каталога.Это может блокировать процесс WebServer от чтения файла PEM.Вы можете проверить это, сравнив метки SELinux файла PEM с каталогом, в котором он находится:

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

Тогда, если это неправильные метки SELinux, вы можете установить метки SELinux файла PEM, просто сославшись на "/var / www / html "directory:

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

Если это решит вашу проблему , то вам также следует подумать о том, что изменение этой метки SELinux означает для безопасности этогоКлюч SSH (например, другие скрипты, работающие на сервере)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...