如何允许“www-data”调用“supervisorctl status”?

如何允许“www-data”调用“supervisorctl status”?

我有一个调用 的 PHP 脚本exec('supervisorctl status 2>&1', $output);,它以www-data用户身份运行(通过 Apache)。

但是该用户无权访问该命令。我想www-data仅允许此supervisorctl status命令的权限。它非常好地输出正在运行的主管进程,我想在我的网络界面中显示这一点。

# 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,这意味着您将使用 调用命令sudo

因此,为了在 php 中执行它,我将运行:

exec('sudo supervisorctl status 2>&1', $output);

这应该可以在www-data.

答案2

默认情况下,非root用户可以执行supervisorctl命令。问题在于套接字权限。您需要将supervisor.sock移动到www-data可访问的路径。例如:/tmp/

为此,更改 /etc/supervisord.conf 中的 file、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

之后,重新启动 Supervisor 并检查状态以确保一切正常。

systemctl restart supervisord
systemctl status supervisord

相关内容