web-dev-qa-db-ja.com

PHPスクリプトからシェルスクリプトを実行する

PHPスクリプト。システムに2つのスクリプトがあります。そのうちの1つはPHPスクリプトです。 client.phpという名前は/var/www/htmlにあり、もう1つは/home/testuserにあるtestscriptというBashスクリプトです。

私の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を実行した後でも、このエラーが発生します。
ブラウザから機能させるにはどうすればよいですか?助けてください。

25
nmadhok

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

例えば/var/www/scripts/testscript

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

次に実行する

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

編集:

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

PHP経由でルートコマンドを実行

14
Panama Jack

セットアップの複雑さを本当に知らないうちに、私はSudoルートが好きです。まず、Webサーバーがルートとして指定されたコマンドを実行できるように、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>
      

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

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

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

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

    Sudo /bin/cp /root/test1 /root/test2
    

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

心に留めておいてください:

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

4
Craig Hesling

私はこの正確な問題に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 {} \;

これは判断よりも運によるものでしたが、現在は完全に機能しています。これがお役に立てば幸いです。

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

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

2
priyolahiri