web-dev-qa-db-ja.com

PHP exec()は、ブラウザ経由で実行されたときにシェルコマンドを実行しません

ある特定のPHPスクリプトを実行してexec()を呼び出し、PDFをJPGに変換するコマンドを実行します。このコマンドはbashで正常に動作します。

最初のトラブルシューティングの推測を先制するには、次の点に注意してください。

  • safe_mode =オフ
  • PDFを含むディレクトリに対する権限。スクリプトは777に設定されており、このディレクトリはJPGが書き込まれている場所でもあります。
  • Exec()に渡すコマンドは、使用されているバイナリ(/ usr/local/bin/convertなど)を明示的に指しています。
  • display_errors =オン
  • error_reporting = E_ALL
  • disable_functions = [空白]
  • Exec()の出力をエコーし​​ていますが、何も返されません。デフォルトで実行されるコマンドは何も返しません。

これをブラウザからPHPスクリプト( http://www.example.com/script.php にアクセス)と呼ぶと、exec()は引数を実行しません。

[〜#〜] important [〜#〜]:スクリプトまたはbashコマンドの作成方法に問題がないことを知っています。 bashから、 'php'を使用してスクリプトを実行でき、動作します(たとえば、 'php script.php'はファイルを変換します)

System()でexec()を切り替えることも試みました。

最後に、私は過去に一度この問題に遭遇しましたが、どのようにそれを修正したか思い出せません。

私が欠けているものがあることを知っているので、私が持っているように他の誰かがこれを経験し、それを修正する方法を覚えていることを願っています!

あなたが提供できる支援を事前にありがとうございます。

アレックス

32
Alex

追加 2>&1コマンドの最後まで。エラーをstderrからstdoutにリダイレクトします。これにより、何が問題なのかが明確になります。

68
Greg

ご想像のとおり、ウェブサーバープロセスのユーザーにはその権限がありません。

6
TomHastjarjanto

それはコマンドラインから(あなた自身のユーザーアカウントの下にあるとき)動作するので、Webサーバーが実行されているアカウント(多くの場合「www-data」)は変換プログラムに対する実行権限を持っていないように聞こえます。

5
Chad Birch

ファイルの許可を検討しましたか?ブラウザーでは、phpは1人のユーザーで実行されていますが、bashで実行すると、ユーザー権限で実行される可能性があります。

それは私がチェックする最初のものです。

エイミー

3
Amy Anuszewski

Apache/webserverユーザーには、シェルコマンドを実行するために必要な権限がありますか?

Clから実行する場合、別のユーザーとして実行している可能性が高いため、どのclが機能するかを説明できますが、ブラウザーでは機能しません。

2
ConroyP

Apacheのユーザー_www-data_には、Sudoを使用して特定のアプリケーションを実行するための特権を付与する必要があります。

  1. コマンド_Sudo visudo_を実行します。実際には、_etc/sudoers_のファイルを編集します。これを行うには、ターミナルで_Sudo visudo_を使用して、編集する複製(temp)sudoersファイルを作成します。
  2. ファイルの最後に、次のexを追加します。-コマンドを使用してスモーキングを再開し、別のアクションにコマンドをマウントする場合は、

_www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount_

(これは、スーパーユーザー(root)特権を使用してrestartおよびmountコマンドを実行することを前提としています。)

ただし、スーパーユーザー権限を使用してすべてのアプリケーションを実行する場合は、上記の代わりに次を追加します。ALLコマンドではなく、非常に危険です。

_www-data ALL=NOPASSWD: ALL
_

3。 sudoersファイルを編集した後(visudoによるsudoersの一時ファイルを編集するので、sudoersファイルに書き込むために一時ファイル(visudo)を保存して終了します。(_wq!_)

4.それで、次のようにexec()を_xxx.php_ script内で使用します。 phpスクリプトでコマンドを使用する前にSudoを使用することを忘れないでください。

例:-

_exec ("Sudo /etc/init.d/smokeping restart 2>&1");
_

したがって、あなたの問題では、使用したいコマンドをstep no (2.)に追加します。PHPスクリプトを追加し、必要に応じて変更します。

1

これは、Webサーバーを介してスクリプトを実行しているユーザーと、bashを介してスクリプトを実行しているユーザーが原因である可能性があります。

通常、ユーザー「www」と同じようにサーバーを介して呼び出されるスクリプト/ execは、このユーザーはあなたのエリアへの書き込みアクセス権を持っていません。ただし、bashでスクリプトを実行すると、書き込み権限が付与されます。

1
user235044

これはImageMagickの問題であり、PHPの問題ではないと判断しました。私はいくつかの修正を試みていますが、それらが機能しない場合は、代わりにPHP共有ライブラリ(おそらくimagick))を使用して作業を行うことになります。

0
Alex

デフォルトの出力デバイスが変更されます。

(有効化後)wwwとしてログインすると、シェル経由で出力されますが、php経由では出力されません。

0
Rudger