PHPのカスタムLinuxホスティングコントロールパネル - rootでコマンドを実行する

PHPのカスタムLinuxホスティングコントロールパネル - rootでコマンドを実行する

LEMP / LAMPスタック管理の経験に基づいて、カスタムLinuxホスティングコントロールパネルを開発したいと思います。これはちょうどペットプロジェクトです。いくつかの障害物にぶつかったと思います。

CPはPHPで書かれており、NginXからポート8000​​のプライマリサーバーとして提供されています。私はフレームワークを使用せず、通常のPHPのみを使用します。

パテからrootとしてログインすると、次のようにシステムuuidを取得できます。

[root@localhost ~]# dmidecode -s system-uuid
997C4DE8-213B-4ACC-8E23-01E79D6CC12F

次のスクリプトを使用してPHPでこれを試すとき:

var_dump(shell_exec('dmidecode -s system-uuid 2>&1'));

次のメッセージが表示されます。

sh:dmidecode:コマンドが見つかりません

上記のコマンドを実行してPHPで出力を取得するにはどうすればよいですか?

Nginx / PHP-FPMがユーザーとして実行されていますnginx。 nginxユーザーをルートグループに追加する必要がありますか?

/etc/init.d/php-fpm restartたとえば、コントロールパネルから(php-fpmゲートウェイの再起動)、非常に具体的なコマンドを実行できるようにしたいとします。

この目標をどのように達成できますか?私のオプションは何ですか? cPanelやDirectAdminなどのコントロールパネルはどのように行いますか?


私も次のことを試しました。コマンドをインストールしてsudo使用sudo visudoし、最後に次の行を追加します。

nginx    ALL=(ALL)    NOPASSWD:/path/to/php_shell.sh
Defaults:nginx        !requiretty

内容はphp_shell.sh次のとおりです。

#!/bin/bash
dmidecode -s system-uuid

それでは、次のように実行しようとしています。

var_dump(shell_exec('sudo sh /path/to/php_shell.sh 2>&1'));

私は得る:sudo: no tty present and no askpass program specified

答え1

dmidecode通常、ディレクトリにあり、常にPATHにあるわけではありません。したがって、PHPは、たとえば、/usr/sbinで見つかったフルパスを使用します。type -p dmidecode/usr/sbin/dmidecode

sudoの場合、そうしなかったsudo sh ...ため、sudo /path/to/php_shell.shNOPASSWDエントリが一致しません。ただし、通常のスクリプトを root として実行できるようにするのではなく、sudo ファイルにコマンドとその引数を明示的にリストする方がよいでしょう。したがって、例えば使用してください。

Defaults:nginx        !requiretty
nginx ALL NOPASSWD:/usr/sbin/dmidecode -s system-uuid

複数のコマンドをrootとして実行する必要がある場合は、同じ行に入力してコンマで区切ります。

関連情報