root ユーザーのみが実行できる外部プログラムを PHP で実行することは常に古い問題であり、従来の方法を使用して実現するのは困難です。これは、通常の状況では、PHP は APACHE のモジュールとして使用されます。つまり、PHP は APACHE の一部であり、APACHE は suEXEC メカニズムを除いて異なるユーザー ID でコマンドを実行できませんが、suEXEC メカニズムは CGI のみ動作するためです。 。
かつて「su - -c COMMAND」を呼び出すことで実現できるという記事がインターネット上にありましたが、何度もテストした結果、suコマンドはSTDINにrootパスワードを入力する必要があるため機能しないことが判明しました。 。
どうすればいいですか?従来の方法では実現が難しいため、別の方法を考えなければなりません。成功の鍵は、ユーザー ID を切り替えられるだけでなく、コマンドにパスワードを入力できる (またはパスワードを入力しない) こともできるツールを用意することです。そのようなツールはありますか?はい、超最高です。
それでは、その方法について話しましょう?
スーパーのインストールと設定は root として行う必要があることに注意してください。
最初のステップ、root に切り替えます
2 番目のステップ、super をインストールします
まず ftp://ftp.mdtsoft.com/pub/super に移動して super-3.14.0-1.i386.rpm をダウンロードします。これは、setuid と super という 2 つのツールと、それらのドキュメントとマニュアルを含む RPM ファイルです。次のコマンドを使用して、システムにインストールします:
% rpm -Uvh super-3.14.0-1.i386.rpm
このコマンドを使用して、この RPM 内のファイルを表示することもできます:
% rpm -qpl super-3.14 .0-1.i386.rpm
結果からわかるように、両方のツールは /bin ディレクトリにインストールされます。
3 番目のステップは super を設定することです
super の設定ファイルは /etc/super.tab です。これはテキスト ファイルであり、形式は比較的複雑です。ただし、ここでは単に数行を追加するだけです。詳細な手順については、man super.tab から参照できます。
Apache を実行しているユーザーがEveryone で、super を介してシステム ユーザーを追加したいとします (useradd コマンドを呼び出します)。その場合は、次の行を super.tab ファイルに追加するだけです:
auser /sbin/useraddEveryone, Hunte
最初の段落は、スーパーが認識できるコマンドのエイリアスです。2 番目の段落は、そのエイリアスに対応するシステム コマンドのフル パスです。3 番目の段落は、コマンドを実行できるユーザーのリストです。カンマで区切られています。 none に加えて、hunte という名前の一般ユーザーもいます。これは次のテストに使用されます。もちろん、システム上に存在する通常のユーザーを使用する必要があります。
この時点で、スーパー構成の準備が整いました。
4 番目のステップ、test
3 番目のステップで指定した非 nobody ユーザーとしてログインし、次のコマンドを実行します:
% /bin/super auser testuser
前の設定にエラーがなければ、ユーザー testuser が正常に作成されるはずです。
% cat /etc/passwd | grep testuser
コマンドを使用して確認できます。
5 番目のステップでは、PHP でコマンドを呼び出します。
以下は PHP コードです:
if ($username)
{
//新しいユーザーが既に存在するかどうかを確認する必要があります
echo 'Creating user<$username> ;...';
system(escapeshellcmd("/bin/super auser $username"));
}
?>
super を使用すると、PHP で root として外部コマンドを実行することが難しくなくなりました。試してみる。
テスト環境: RedHat Linux 7.0 (カーネル 2.4.3) + Apache 1.3.9 + PHP 4.0.4pl1