我有一个调用 的 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