Apacheを介してユーザーとして実行されるexec('supervisorctl status 2>&1', $output);
呼び出しPHPスクリプトがあります。www-data
ただし、このユーザーはコマンドにアクセスできません。このコマンドに対してのみwww-data
権限を許可したいと思います。supervisorctl status
実行中のスーパーバイザープロセスを非常に見事に出力し、それをWebインターフェースに表示したいと思います。
# Running `supervisorctl status` under any user except root:
$ supervisorctl status
error: <class 'socket.error'>, [Errno 13] Permission denied: file: /usr/lib/python2.7/socket.py line: 228
/etc/sudoers
このセクションをファイルに追加しようとしましたが、(を使用してvisudo
)同じエラーが発生しました(エラーがPythonを参照しているため、より多くの権限が必要になる場合があります)。
# /etc/sudoers
Cmnd_Alias SUPERVISOR_STATUS = /usr/bin/supervisorctl status
www-data ALL=(ALL) NOPASSWD: SUPERVISOR_STATUS
答え1
私はそれを働かせた。明らかに何かを定義するとき、/etc/sudoers
これはcallコマンドを使用することを意味しますsudo
。
したがって、PHPで実行するには、次のようにします。
exec('sudo supervisorctl status 2>&1', $output);
この機能はwww-data
。
答え2
デフォルトでは、root 以外のユーザーは Supervisorctl コマンドを実行できます。問題はソケット権限にあります。 Supervisor.sockをwww-dataにアクセスできるパスに移動する必要があります。例: /tmp/
これを行うには、/etc/supervisord.confでファイル、chown、およびserverurl変数を変更します。
[unix_http_server]
file=/tmp/supervisor.sock ;custom
chown=carlos:mygroup ; socket file uid:gid owner
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
その後、スーパーバイザを再起動し、ステータスを確認してすべてが正常であることを確認します。
systemctl restart supervisord
systemctl status supervisord