26

システムに存在する Bash スクリプトを PHP スクリプトから実行したいと考えています。システムに 2 つのスクリプトが存在します。1 つはclient.phppresent atという PHP スクリプトで、もう 1 つは present at/var/www/htmlという Bash スクリプトです。testscript/home/testuser

私のclient.phpスクリプトは次のようになります

<?php
  $message=shell_exec("/home/testuser/testscript 2>&1");
  print_r($message);
?>  

私のテストスクリプトは次のようになります

#!/bin/bash
echo "Testscript run succesful"

端末で次の操作を行うと

php client.php

ターミナルで次の出力が得られます

Testscript run successful

しかし、私がページを開くと

http://serverdomain/client.php

次の出力が得られます

sh: /home/testuser/testscript: Permission denied 

chmod +x testscript を実行した後でも、このエラーが発生します。
ブラウザから動作させるにはどうすればよいですか? 助けてください。

4

4 に答える 4

18

Web からはアクセスできないが、PHP からはアクセスできるように、WWW フォルダーの下にスクリプトと呼ばれるディレクトリを作成します。

例えば/var/www/scripts/testscript

のユーザー/グループがtestscriptWeb ファイルと同じであることを確認してください。たとえば、client.phpが所有している場合、apache:apacheを使用して bash スクリプトを同じユーザー/グループに変更しchownます。を実行すると、client.phpおよび Web ファイルの所有者を確認できますls -al

次に実行します

<?php
      $message=shell_exec("/var/www/scripts/testscript 2>&1");
      print_r($message);
    ?>  

編集:

本当にウェブサーバーからルートとしてファイルを実行したい場合は、以下のバイナリ ラッパーを試すことができます。やりたいことと同じことについては、このソリューションを確認してください。

PHP 経由で root コマンドを実行する

于 2013-06-17T16:13:55.567 に答える
5

セットアップの複雑さをよく知らなくても、sudo ルートが気に入っています。最初に、Web サーバーが特定のコマンドを root として sudo 実行できるように sudo を構成する必要があります。次に、Webサーバーのshell_exec(testscript)がsudoでコマンドを実行するスクリプトが必要です。

Apache と sudo を使用する Debian ボックスの場合:

  1. sudo を構成します。

    • root として次のコマンドを実行して、sudo 用の新しい/専用の構成ファイルを編集します。

      visudo -f /etc/sudoers.d/Webserver
      

      (または でファイルを呼び出したいもの/etc/sudoers.d/)

    • 以下をファイルに追加します。

      www-data ALL = (root) NOPASSWD: <executable_file_path>
      

      where<executable_file_path>は、名前にフルパスを付けてルートとして実行できるようにする必要があるコマンドです(/bin/chownchown実行可能ファイルの場合など)。実行可能ファイルが毎回同じ引数で実行される場合は、実行可能ファイルの名前の直後にその引数を追加して、その使用をさらに制限できます。

      たとえば、常に同じファイルを /root/ ディレクトリにコピーしたい場合は、次のように記述します。

      www-data ALL = (root) NOPASSWD: /bin/cp /root/test1 /root/test2
      
  2. スクリプト (testscript) を変更します。

    スクリプトを編集して、sudoroot 権限が必要なコマンド (sudo /bin/chown ...または などsudo /bin/cp /root/test1 /root/test2) の前に表示されるようにします。sudo 構成ファイルで指定された引数が、このファイルの実行可能ファイルで使用されている引数と正確に一致していることを確認してください。したがって、上記の例では、スクリプトに次のように記述します。

    sudo /bin/cp /root/test1 /root/test2
    

それでもアクセス許可が拒否される場合は、スクリプト ファイルとその親ディレクトリのアクセス許可により、Web サーバーがスクリプト自体を実行できない可能性があります。したがって、スクリプトをより適切なディレクトリに移動するか、スクリプトと親ディレクトリのアクセス許可を変更して www-data (ユーザーまたはグループ) による実行を許可する必要がありますが、これはこのチュートリアルの範囲を超えています。

次の点に注意してください。

sudo を構成するときの目的は、コマンドを最も制限された形式で許可することです。たとえば、cp コマンドの一般的な使用を許可する代わりに引数が/root/test1 /root/test2の場合にのみ cp コマンドを許可します。これは、cpの引数 (および cp の機能は変更できない) を意味します。

于 2013-06-18T08:41:16.307 に答える
3

私はこの正確な問題に3日間苦労していました。スクリプトのアクセス許可を 755 に設定しました。次のようにスクリプトを呼び出していました。

<?php
   $outcome = shell_exec('/tmp/clearUp.sh');
   echo $outcome;
?>

私のスクリプトは次のとおりでした。

#!bin/bash
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;

出力もフィードバックも得られませんでした。スクリプトを実行するために行った変更は、スクリプト内の tmp に cd を追加することでした。

#!bin/bash
cd /tmp;
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;

これは判断よりも運によるものでしたが、現在は完全に機能しています。これが役立つことを願っています。

于 2014-07-17T11:15:28.313 に答える
2

簡単な問題です。ターミナルから実行しているときは、特権ユーザーとしてターミナルから php ファイルを実行しています。Web ブラウザーから php に移動すると、php スクリプトは、ホーム ディレクトリ内のファイルを実行する権限を持たない Web サーバー ユーザーとして実行されます。Ubuntu では、www-data ユーザーは apache Web サーバー ユーザーです。ubuntu を使用している場合は、次のようにする必要があります: chown yourusername:www-data /home/testuser/testscript chmod g+x /home/testuser/testscript

上記のことは、ファイルのユーザー所有権をあなたに譲渡し、そのファイルの所有権を webserver グループに与えることです。次のコマンドは、グループにファイルへの実行許可を与えます。次回ブラウザから実行するときは、動作するはずです。

于 2013-06-17T17:36:58.617 に答える