コマンドラインスクリプトとしてではなく、HTTPによって呼び出されるPHPスクリプトがあります。このスクリプトは、現在のWebサーバーユーザーwww-data以外のユーザーとしてシェルコマンドを呼び出す必要があります。
例:
<?php
echo Shell_exec('Sudo -u myusername -S /usr/bin/whoami'); // returns nothing :(
echo Shell_exec('whoami'); // returns www-data
これを呼び出すと2つのコマンドSudo -u myusername -S /usr/bin/whoami
およびwhoami
は、それらが返すコマンドラインで直接
myusername
www-data
これに関する結果もありません:
<?php
echo Shell_exec('echo "mypass" | Sudo -u myusername -S /usr/bin/whoami');
私にとって、SudoはPHPのShell_exec()と一緒に動作しないようです。
まず、実行しているSudoコマンドがわかりません。 Sudo -u username
は、ユーザー1として、ユーザー2としてコマンドをSudoすることを許可することになっています(この例では、ユーザー1として、コマンドlsを実行します)。
Sudo -u usertwo ls
上記のコマンドを実際のユーザー名の代わりにusername
に置き換えてサニタイズを試みた場合はお詫び申し上げますが、確認が取れていないため、最初にこの点を指摘する必要があります。
次に、ユーザーが別のユーザーとしてさまざまなコマンドを実行できるようにSudoを構成する必要があります。まず、www-dataがユーザーのフリブルとしてlsコマンドをSudoできるようにします。あなたは置くことによってこれをテストすることができます
www-data ALL = (fribble) NOPASSWD: ls
sudoersファイル内(実際のユーザーをフリブルに置き換えます)。次に、ls -la /tmp
PHPスクリプト内から実行して、ディレクトリ一覧が表示されるかどうかを確認します。
私はジェームス・ローリーに同意します。www-dataユーザーが任意のユーザーとしてパスワードなしで任意のコマンドをSudoすることを許可することは良い考えではありませんが、www-dataを実行しようとしているコマンドを明確にすると、これはそれを行うための賢明な方法。
編集:
sudoersファイルでlsを試し、Sudo -u user2 ls -al /tmp
PHPスクリプトの場合、ディレクトリリストが表示されます。これは、SudoがPHPで正常に動作することを強く示唆しています。
確かに、/bin/touch
sudoersファイルにSudo -u user2 touch /tmp/TESTFILE
PHPスクリプトで実行し、それを実行しますか?ファイルの場合/tmp/TESTFILE
が表示され、user2が所有しています。SudoとPHPがうまく機能していることを確認できます。
あなたがSudo Javaを試していることを知っていたとしたら、私は元の質問には答えなかっただろうと告白しなければなりません。なぜなら、Javaは、予測できないがらくたの巨大な袋であり、必要な環境が得られない場合(そしてSudoが環境をかなり厳密にサニタイズする場合)、完全な赤ちゃんです。しかし、少なくとも上記のテストは、問題が何であれ、それがnotであることを確認するのに役立ちます。 PHPとSudoがうまくいっていない問題。
WebサーバーユーザーにSudoアクセスを許可しないでください。問題が発生するだけです。代わりにsetuidビットを調べてください。chmod u+s some_file_that_needs_executing_as_another_user.pl
そのファイルが実行されるときはいつでも、それを作成したユーザーによって効果的に実行されます。
余談ですが、Sudoまたはpasswdにパスワードをパイプすることはできません。
Www-dataユーザーとして実行されているWebサーバープロセスに特別な権限を付与する場合は、次のいずれかを実行できます。
1- www-dataをsudoersファイルに追加して、パスワードを要求せずに必要なコマンド/スクリプトを実行できるようにします。
2- suexec Apacheモジュールを有効にします。これにより、仮想ホストごとにユーザーをwww-dataから他の特権ユーザーに変更できます。したがって、サーバー全体でユーザーを変更する必要はありません。