「www-data」が「supervisorctl status」を呼び出すことを許可する方法は?

「www-data」が「supervisorctl status」を呼び出すことを許可する方法は?

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

関連情報