"www-data"가 "supervisorctl status"를 호출하도록 허용하는 방법은 무엇입니까?

"www-data"가 "supervisorctl status"를 호출하도록 허용하는 방법은 무엇입니까?

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

관련 정보