Linux Ubuntuでのphp shell_exec()パーミッション


13

Linuxサーバーを使用してphpアプリケーションを開発しています。私の問題は実行中ですshell_exec()いくつかのexeファイルを呼び出すようにしているのが機能しない(実際にはexeではなく、Linux実行可能ファイルの一種です)

echo shell_exec("whoami");

デーモンを得た

echo shell_exec("ls")

ファイル名を取得しましたが、

echo shell_exec("php -v")

何もない、空白のページ

echo shell_exec("php ....bla bla bla")

空白ページも。

terminal(user hu)で入力すると、これらすべてのコマンドが機能します。私は数時間グーグルを検索しました、人々は許可のためにそれを言います。Linuxの経験はありません。PHPでプログラムを実行するにはどうすればよいですか?

回答:


10

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

  1. コマンドを実行しますsudo visudo。実際に、ファイルを編集しますetc/sudoers。それを行うには、sudo visudoターミナルで、sudoers編集する複製(一時)ファイルを使用します。
  2. ファイルの最後に、次のexを追加します:- restartスモーキングにphpコマンドを使用し、質問の別のアクションにコマンドを使用する場合、

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php

(これは、スーパーユーザー(root)特権を使用して実行するコマンドrestartphpコマンドを使用することを前提としています。そしてphpusr/bin/pathでコマンドを使用します)

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

www-data ALL=NOPASSWD: ALL

3. sudoersファイルを編集した後(そのためvisudo、一時ファイルを編集しsudoersて保存し、一時ファイル(visudo)を終了してsudoersファイルに書き込みます。(wq!

4.これで、スクリプト内でexec()またはshell_exec次の方法でxxx.phpスクリプト内で使用できます。phpスクリプトでコマンドを使用するsudo前に使用することを忘れないでください。

例:-

exec ("sudo /etc/init.d/smokeping restart 2>&1");

または

shell_exec("sudo php -v"); 

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

ここにあなたと同じ問題があります/programming//a/22953339/1862107


この質問はsudoの使用に関するものではありません。
トリカス

これはひどく言い回されている
バーニーチェンバーズ

5

PHPバイナリへのパス全体を指定してみてください。たとえば、 /usr/bin/php

わからない場合は、次を使用して見つけてください。 which php


echo shell_exec( "/ usr / bin / php -v"); 動作しません。
ngoaho91 14

「機能しない」と言うと何が得られますか?つまり、エラーはありますか?php / apacheエラーログに何かありますか?ページが空白の場合、ソースを表示して作業するものを提供しますか?残念ながら、用語「動作しない」は、私たちに与えていない何も ...と仕事への
Keiranホロウェイ

@ ngoaho91-通常、ログは/var/log/httpd/error*です。
slm

:D空白ページが表示されましたが、何も表示されません。php / apacheエラーログファイルはどこにありますか?
ngoaho91 14

@ ngoaho91-これはどのLinuxディストリビューションですか?CentOS、Ubuntu?
slm

4

あなたは、一般的のようなアプリケーションに完全なパスを指定したいwhoamilsphp。プログラムの場所が不明な場合(フルパス)、次のように確認できます。

$ type php
php is /usr/bin/php

次に、スクリプトでそのように指定します。

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>

コマンドを実行します。php => phpは/ usr / bin / phpです。しかし、フルパスコマンドを使用しても空白のページが返されます。
ngoaho91 14

これを行うとどうなりますecho shell_exec("/usr/bin/php somefile.php 2>&1")か?
slm

echo shell_exec( "/ usr / bin / php index.php 2>&1")=> / usr / bin / php:再配置エラー:/ usr / bin / php:シンボルX509_free、バージョンOPENSSL_1.0.0がファイルlibcryptoで定義されていません。リンク時に参照してso.1.0.0
ngoaho91

OK、Webサーバー(Apache)は通常、ではなく別のユーザーとして実行されていhuます。そのため、スクリプトのphp実行が次のように設定されていることを確認する必要がありますchmod 755 somescript.php。これにより、Apacheを実行しているユーザーが.phpファイルを実行および読み取りできるようになります。
slm

1
@ ngoaho91-すべてが正常になっているはずです。このエラーは、Apache / PHPのセットアップに問題があることを示しています。freetutorialssubmit.com/php-relocation-error/2221
slm

2

php.iniは使用可能なコマンドセットを制限していますか?

これは私のからです /etc/php5/php.ini

; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =

いいえ、あなたと同じ私のini
ngoaho91 14

2

shell_execの問題をデバッグする方法

OK、ここで問題があります:ターミナルで動作し、phpのshell_exec(またはexec、spawnなど)で動作しないものがあります。考えてみましょう:あなたとphpの違いは何ですか?3つあります。

PHPはHTTPサーバールールから実行されます

実際、yournameユーザーの端末はユーザーから実行されており、phpはから実行されていwww-dataます。したがって、最初のアイデアは、www-dataユーザーからターミナルを開いて同じコマンドを試すことです。そう....

  • /etc/passwdファイルを開き、www-dataユーザーの行を見つけて、ログインシェル(最後の1つ)を/bin/false(または何でも)から/bin/bashます。
  • www-dataの端末を開きます:su www-data
  • php -vまたはphpから実行できないものを試してください。うまくいかない場合-素敵なログが表示され、問題をデバッグできるようになります。
  • /etc/passwdあなたが終わっている間にバックファイルを修正することを忘れないでください

PHPはPHPから実行されます

PHPは妄想的であり、Apache / nginxおよびphp.iniの構成には多くのオプションがあり、それらの試みが失敗する可能性があります。

これはデバッグが少し複雑です。ここには2つのオプションがあります。

  • ブラウザでログを有効にして、問題を確認します。ブラウザでエラーを表示するにはphp.ini、を編集しdisplay_errors、その他のすべてのフラグをオンにします。それらを読んでデバッグすることができます。

  • www-dataのシェルを取得し(最初のセクションを参照)、次のようなものを実行します

echo '<?php shell_exec("php -v"); ?>' | php

コンソールで同じphpコードを実行し、エラーを確認してデバッグできるようになります。

PHPはSELinux / apparmorから実行されます

Selinuxとapparmorは、アプリケーションが特定のアクション(他のアプリケーションや特定のアプリケーションを生成するなど)を実行することを禁止するセキュリティ関連のものです。サーバーで有効になっている可能性があります。

確認するには-selinux / apparmorを無効にし、問題が存在するかどうかを確認します。

修正するには-適切なマニュアルを読み、あなたのケースの書き込み許容ルールを修正します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.