[英]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腳本,需要執行以下操作:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.