簡體   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