Apache를 통해 사용자로 실행되는 exec('supervisorctl status 2>&1', $output);
호출 PHP 스크립트가 있습니다 .www-data
하지만 이 사용자는 명령에 액세스할 수 없습니다. 이 명령에 대해서만 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
이는 call 명령을 사용한다는 의미입니다 sudo
.
따라서 PHP에서 실행하려면 다음을 실행합니다.
exec('sudo supervisorctl status 2>&1', $output);
이 기능은 www-data
.
답변2
기본적으로 루트가 아닌 사용자는 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
그런 다음 Supervisor를 다시 시작하고 상태를 확인하여 모든 것이 정상인지 확인하십시오.
systemctl restart supervisord
systemctl status supervisord