2

私はこの投稿にできるだけ多くの情報を含めるように努めました。

Amazon EC2 UbuntuサーバーでPostfixを使用していますが、アドレスにエイリアスしたPHPスクリプトが起動していないようです。メーリングは正常に機能しますが、スクリプトが実行されません。私はおそらく簡単なことを見逃しているので、これで他のアイデアをいただければ幸いです。

以下のコードはスクリプトのコードです。現時点では、の内容をファイルに書き込むのは基本的なスクリプトにすぎませんphp://stdin。これがこのスクリプトを作成するための最良の方法であるかどうかはわかりませんが、この問題のトラブルシューティングに使用するのは一時的なものであるため、現時点では問題ないようです。

#!/usr/bin/php -q
<?php
$data = '';
$fileName = "parsedData.txt";
$stdin = fopen('php://stdin', 'r');
$fh = fopen($fileName, 'w');
while(!feof($stdin))
{
     $data .= fgets($stdin, 8192);
}
fwrite($fh, $data);
fclose($stdin);
fclose($fh);
?>

テキストを含む.txtファイルを渡すことで、これが機能することを確認しました。

./test2.php < data.txt

PHPスクリプトがローカルで正常に機能しているように見えるので、正しく呼び出されていることを確認する必要があります。sudo chmod 777test2.phpスクリプトで実行されました。関連する/etc/aliasesファイルエントリは次のとおりです。

test: "|/usr/bin/php -q /var/test/php/test2.php"

これを変更するたびにnewaliasesを実行します。これは、phpの場所を完全に指定するため、最も正しい構文のようです。test@mydomainエイリアスが設定されていない場合、内部と外部の両方から正常に電子メールを受信します。syslogによると、これはmaildirではなくコマンドに正常に配信されます。

postfix/local[2117]: 022AB407CC: to=<test@mydomain.com>, relay=local, delay=0.5, delays=0.43/0.02/0/0.05, dsn=2.0.0, status=sent **(delivered to command: /usr/bin/php -q /var/test/php/test2.php)**

エイリアスも次の方法で書き込まれましたが、成功しませんでした(構文が間違っているためにコマンドではなくmaildirに移動するか、スクリプトが起動しないため)。

test: |"php -q /var/test/php/test2.php"
test: "|php -q /var/test/php/test2.php"
test: |"/usr/bin/php -q /var/test/php/test2.php"
test: "| php -q /var/test/php/test2.php"
test: "|/var/test/php/test2.php"
test: |"/var/test/php/test2.php"

私のpostfixmain.cfファイルの関連部分は次のようになります-

myhostname = domainnamehere.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = domainnamehere.com, internalawsiphere, localhostinternalaws, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_command =
home_mailbox = Maildir/
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

スクリプトが正常に呼び出された場合にphpログファイルに表示されるようにerror_log("script has started!");、最初に持っていました。test2.phpphp.iniにアクセスしてerror_loggingをオンにし、保存先を指定しましたが、これを機能させることができませんでした。これを機能させると、スクリプトが関数に移動したときに失敗したかどうかを判断できるphp://stdinので役立ちます。これは、catされた.txtファイルではなく電子メールの処理に問題がある可能性があるためです。

私の最終目標は、特定のアドレスの電子メールを添付ファイルとともにMySQLデータベースに保存し、各ファイル/電子メールの一意のコードをユーザーに返すサービスを取得することです。phpスクリプトを使用するよりも、このようなことを行う簡単な方法はありますか?squirrelmailやdbmailのようなものはこれを行いますか?

私はこれで私の考えを完全に使い果たしました。たぶん私は別のメールサービスを試してみるべきですか?

StackOverflowの賢明な人々、助けてください!

4

1 に答える 1

1

まず最初に、chmod 777 <foo>ほとんどの場合、大きな間違いです。このコマンドを実行したという事実によって示されるように、あなたは絶望的な状態にあることを認識しています。システムの各部分が適切に機能するために必要な最小限の特権でシステムを構成する必要があります。これにより、セキュリティ違反を防ぎ、不要な結合減らすことができます。ただし、実行可能ファイルは、実行可能所有者以外の誰もが書き込み可能であってはなりません。それでも、私はそれを強くお勧めします。

さて、あなたの問題について:

#!/usr/bin/php -q
<?php
$data = '';
$fileName = "parsedData.txt";

相対パス名を使用してファイルを参照しています。これは、起動するディレクトリに常に自信がある場合、または起動するディレクトリをユーザーが制御できるようにする場合は問題ありませんが、自動化ツールでは通常はお勧めできません。この/etc/aliasesメカニズムは、ホームディレクトリでエイリアスコマンドを実行し、目的のためだけpostfixに作成された空のディレクトリを選択する可能性があります。将来のリリースでは、この動作を自由に変更できます。このパス名を、このファイルを作成する場所を正確に示す絶対/varパス名に変更するか、明示的に挿入しますchdir()スクリプトの開始時に呼び出して、ディレクトリをデータの移動先に正確に変更します。

次:

$fh = fopen($fileName, 'w');
while(!feof($stdin))
{
     $data .= fgets($stdin, 8192);
}
fwrite($fh, $data);

ファイルが実際に開かれたことを確認していません。それらの戻り値を確認してください。彼らはあなたのために非常に迅速に失敗を報告し、あなたがあなたのコードのバグやローカルの設定ミスを見つけるのを助けます。perror(3)が失敗したかを正確に伝える関数に相当するものを伝えるのに十分なPHPの知識はありませんが、人間が読める形式のエラーコードをインタープリターから取得するのはそれほど難しいことではありません。エラーコードを無視しないでください。vsの違いを知っていると、コードがデプロイされてから時間を節約できます。Permission DeniedFile or directory not found

また、Michaelが指摘しているように、強制アクセス制御ツールは、アプリケーションが特定の場所に書き込むのを防ぐことができます。Ubuntuの「デフォルト」のMACツールは AppArmorですが、SELinuxTOMOYO、またはSMACKはすべて優れた選択肢です。実行dmesgして調べ、/var/log/audit/audit.logポリシー違反がないかどうかを確認します。ある場合、問題を解決するために実行する手順は、使用しているMACシステムによって異なります。あなたはUbuntuを使用しているので、AppArmorが最も可能性が高いです。を実行aa-statusして、システムに制限されているサービスの概要をすばやく確認し、aa-logprof必要に応じてポリシーを変更するように求められます。(やみくもにしないでください「許可」と言ってください。おそらく、アクティブなエクスプロイトの試みは拒否されています。)

(まだMACシステムを使用していない場合は、使用することを検討してください。私はAppArmorプロジェクトに12年間携わっており、ネットワークを介して通信するすべてのアプリケーションを制限しないことを検討していませんが、それは私自身のセキュリティニーズです。 。より多くのパラノイドの人々は彼らのシステムのより多くを閉じ込めたいと思うかもしれません、より少ないパラノイアの人々は彼らのシステムのより少ないものを閉じ込めたいと思うかもしれません。)

于 2012-04-12T02:07:10.503 に答える