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を実行した後でも、このエラーが発生します。
ブラウザから機能させるにはどうすればよいですか?助けてください。
Webからは到達できないがPHPからは到達できるように、WWWフォルダーの下にスクリプトと呼ばれるディレクトリを作成します。
例えば/var/www/scripts/testscript
testscript
のユーザー/グループがWebファイルと同じであることを確認してください。たとえば、client.php
の所有者はApache:apache
、chown
を使用してbashスクリプトを同じユーザー/グループに変更します。 client.php
およびWebファイルは、ls -al
。
次に実行する
<?php
$message=Shell_exec("/var/www/scripts/testscript 2>&1");
print_r($message);
?>
編集:
Webサーバーからルートとしてファイルを本当に実行したい場合は、以下のこのバイナリラッパーを試すことができます。あなたがしたい同じことのためにこのソリューションをチェックしてください。
セットアップの複雑さを本当に知らないうちに、私はSudoルートが好きです。まず、Webサーバーがルートとして指定されたコマンドを実行できるように、Sudoを構成する必要があります。次に、WebサーバーShell_execの(testscript)がSudoでコマンドを実行するスクリプトを用意する必要があります。
ApacheとSudoを使用するDebianボックスの場合:
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
スクリプト(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の機能は変更できません)。
私はこの正確な問題に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
上記はファイルのユーザー所有権をあなたに移し、ウェブサーバーグループにその所有権を与えます。次のコマンドは、ファイルにグループの実行許可を与えます。次回、ブラウザから実行すると、動作するはずです。