AWS EC2 Apache 用户无法 运行 php exec
AWS EC2 Apache User Cannot run php exec
我正在使用以下 PHP 脚本从我的服务器发送电子邮件。在数据库中创建新记录时,我需要向管理员发送电子邮件。因此,在更新数据库的同一个 php 脚本中,我想触发发送电子邮件的另一个脚本。
问题是无论我做什么,apache 都不会在 web/api 请求时执行电子邮件脚本。
但是,当我从命令行 运行 php sendemail.php
时它起作用了。此外,当我 运行 php updatedb.php
其中包括 exec('php sendemail.php')
也可以从命令行工作时(这些都是用根“ec2-user”执行的)。
我尝试过的事情:
- 我检查了php.ini中禁用的功能,它是空的,没有禁用任何东西。
- 我尝试更改文件权限以包含 apache 组的 'x' 仍然不行。
- 我尝试用
shell_exec
和 include
替换 exec
,但没有成功。
这里是'sendemail.php':
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
use Aws\Ses\SesClient;
use Aws\Exception\AwsException;
$SesClient = new SesClient([
'profile' => 'default',
'version' => '2010-12-01',
'region' => 'us-west-2'
]);
$sender_email = 'sender@example.com';
$recipient_emails = ['recipient1@example.com','recipient2@example.com'];
$configuration_set = 'ConfigSet';
$subject = 'Amazon SES test (AWS SDK for PHP)';
$plaintext_body = 'This email was sent with Amazon SES using the AWS SDK for PHP.' ;
$html_body = '<h1>AWS Amazon Simple Email Service Test Email</h1>'.
'<p>This email was sent with <a href="https://aws.amazon.com/ses/">'.
'Amazon SES</a> using the <a href="https://aws.amazon.com/sdk-for-php/">'.
'AWS SDK for PHP</a>.</p>';
$char_set = 'UTF-8';
try {
$result = $SesClient->sendEmail([
'Destination' => [
'ToAddresses' => $recipient_emails,
],
'ReplyToAddresses' => [$sender_email],
'Source' => $sender_email,
'Message' => [
'Body' => [
'Html' => [
'Charset' => $char_set,
'Data' => $html_body,
],
'Text' => [
'Charset' => $char_set,
'Data' => $plaintext_body,
],
],
'Subject' => [
'Charset' => $char_set,
'Data' => $subject,
],
],
'ConfigurationSetName' => $configuration_set,
]);
$messageId = $result['MessageId'];
echo("Email sent! Message ID: $messageId"."\n");
} catch (AwsException $e) {
// output error message if fails
echo $e->getMessage();
echo("The email was not sent. Error message: ".$e->getAwsErrorMessage()."\n");
echo "\n";
}
updatedb.php 文件的简短版本,省略了所有交易:
<?php
exec('php send_email.php', $sendEmail);
require_once 'response.php';
$response = new response();
$response->setHttpStatusCode(201);
$response->setSuccess(true);
$response->addMessage('DB Record Inserted successfully ::: ');
$response->setData($sendEmail);
$response->send();
?>
在 updatedb.php
文件中,如果我将第一行更改为 echo exec('whoami')
并从网络上点击它,它就会起作用。这正是我正在寻找的,除了我想为 php sendemail.php
工作
环境:AWS EC2 亚马逊 Linux 2 AMI。 PHP7.2.34
我希望这是清楚的。我是 linux 的初学者。请帮忙。在此先感谢大家。
非常感谢@Riz 你关于 sudo -u apache php sendemail.php
的提示拯救了我的一天!我能够在命令行上进行调试,结果发现我的错误是我原来的 sendemail.php
脚本中的行 require 'vendor/autoload.php';
我需要来自不属于 [=] 的目录中的文件13=]组。因此,一旦我将供应商文件夹移动到与 sendemail.php
脚本文件相同的文件夹中,一切都很好!
经验教训:确保所有 required/included 文件都属于 apache
组。无需授予 apache 对任何文件的任何执行权限。
我正在使用以下 PHP 脚本从我的服务器发送电子邮件。在数据库中创建新记录时,我需要向管理员发送电子邮件。因此,在更新数据库的同一个 php 脚本中,我想触发发送电子邮件的另一个脚本。
问题是无论我做什么,apache 都不会在 web/api 请求时执行电子邮件脚本。
但是,当我从命令行 运行 php sendemail.php
时它起作用了。此外,当我 运行 php updatedb.php
其中包括 exec('php sendemail.php')
也可以从命令行工作时(这些都是用根“ec2-user”执行的)。
我尝试过的事情:
- 我检查了php.ini中禁用的功能,它是空的,没有禁用任何东西。
- 我尝试更改文件权限以包含 apache 组的 'x' 仍然不行。
- 我尝试用
shell_exec
和include
替换exec
,但没有成功。
这里是'sendemail.php':
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
use Aws\Ses\SesClient;
use Aws\Exception\AwsException;
$SesClient = new SesClient([
'profile' => 'default',
'version' => '2010-12-01',
'region' => 'us-west-2'
]);
$sender_email = 'sender@example.com';
$recipient_emails = ['recipient1@example.com','recipient2@example.com'];
$configuration_set = 'ConfigSet';
$subject = 'Amazon SES test (AWS SDK for PHP)';
$plaintext_body = 'This email was sent with Amazon SES using the AWS SDK for PHP.' ;
$html_body = '<h1>AWS Amazon Simple Email Service Test Email</h1>'.
'<p>This email was sent with <a href="https://aws.amazon.com/ses/">'.
'Amazon SES</a> using the <a href="https://aws.amazon.com/sdk-for-php/">'.
'AWS SDK for PHP</a>.</p>';
$char_set = 'UTF-8';
try {
$result = $SesClient->sendEmail([
'Destination' => [
'ToAddresses' => $recipient_emails,
],
'ReplyToAddresses' => [$sender_email],
'Source' => $sender_email,
'Message' => [
'Body' => [
'Html' => [
'Charset' => $char_set,
'Data' => $html_body,
],
'Text' => [
'Charset' => $char_set,
'Data' => $plaintext_body,
],
],
'Subject' => [
'Charset' => $char_set,
'Data' => $subject,
],
],
'ConfigurationSetName' => $configuration_set,
]);
$messageId = $result['MessageId'];
echo("Email sent! Message ID: $messageId"."\n");
} catch (AwsException $e) {
// output error message if fails
echo $e->getMessage();
echo("The email was not sent. Error message: ".$e->getAwsErrorMessage()."\n");
echo "\n";
}
updatedb.php 文件的简短版本,省略了所有交易:
<?php
exec('php send_email.php', $sendEmail);
require_once 'response.php';
$response = new response();
$response->setHttpStatusCode(201);
$response->setSuccess(true);
$response->addMessage('DB Record Inserted successfully ::: ');
$response->setData($sendEmail);
$response->send();
?>
在 updatedb.php
文件中,如果我将第一行更改为 echo exec('whoami')
并从网络上点击它,它就会起作用。这正是我正在寻找的,除了我想为 php sendemail.php
环境:AWS EC2 亚马逊 Linux 2 AMI。 PHP7.2.34
我希望这是清楚的。我是 linux 的初学者。请帮忙。在此先感谢大家。
非常感谢@Riz 你关于 sudo -u apache php sendemail.php
的提示拯救了我的一天!我能够在命令行上进行调试,结果发现我的错误是我原来的 sendemail.php
脚本中的行 require 'vendor/autoload.php';
我需要来自不属于 [=] 的目录中的文件13=]组。因此,一旦我将供应商文件夹移动到与 sendemail.php
脚本文件相同的文件夹中,一切都很好!
经验教训:确保所有 required/included 文件都属于 apache
组。无需授予 apache 对任何文件的任何执行权限。