我已经苦苦挣扎了三天,以使用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脚本都能完美运行。
答案 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脚本,需要执行以下操作: