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.sh
NOPASSWDエントリが一致しません。ただし、通常のスクリプトを root として実行できるようにするのではなく、sudo ファイルにコマンドとその引数を明示的にリストする方がよいでしょう。したがって、例えば使用してください。
Defaults:nginx !requiretty
nginx ALL NOPASSWD:/usr/sbin/dmidecode -s system-uuid
複数のコマンドをrootとして実行する必要がある場合は、同じ行に入力してコンマで区切ります。