
인터넷 라디오도 재생하는 웹서버가 있습니다. www-data 사용자로서 저는 몇 가지 명령을 실행하고 싶습니다. 예를 들어 다음과 같이 만들었습니다./etc/sudoers파일:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer
그리고 PHP를 구성하면 다음과 같이 비밀번호를 사용하지 않고 볼륨을 조작할 수 있습니다.
exec('sudo -u user amixer set Master 3%-');
그리고:
exec('sudo -u user amixer set Master 3%+');
하지만 이제 다음 명령을 실행하여 내 서비스를 다시 시작할 수 있기를 원합니다.
exec('sudo -u user service servicename restart');
그래서 나는 다음을 시도했습니다.
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /bin/service
이:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, /bin/service
그리고 이것조차:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer
www-data ALL=(ALL) NOPASSWD: /bin/service
그러나 그들 중 누구도 작동하지 않는 것 같습니다. 저를 도와주세요.
미안해요 - 내 실수예요. 몇 가지 변경 작업을 수행했으며 /sbin 양식을 /bin에 연결하려고 시도했습니다.
이제 다음과 같이 변경했습니다.
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /usr/sbin/service
그리고 그것은 작동합니다! 감사해요! 주제가 종료되었습니다.
답변1
솔루션에 주의하세요. 그런 식으로 모든 서비스를 시작, 중지 또는 다시 시작할 수 있습니다!
이 명령을 실행하는 쉘 스크립트를 만드는 것이 좋습니다.
echo "#!/bin/sh' > /usr/bin/amixer_restart
echo "sudo -u user service amixer restart' >> /usr/bin/amixer_restart
적절한 권한 부여(550은 루트 및 그룹 www-data가 읽고 실행할 수 있음을 의미하며 아무도 쓸 수 없음을 의미함)
sudo chown root:www-data /usr/bin/amixer_restart
sudo chmod 550 /usr/bin/amixer_restart
그리고 이 스크립트에서 Apache가 sudo를 수행하도록 허용합니다.
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer_restart
답변2
이것이 내가 한 일입니다.
- 다음을 실행하여 apache2를 설치하십시오.
sudo apt-get install apache2
- 다음을 실행하여 Apache가 cgi 스크립트를 실행할 수 있는지 확인하십시오.
sudo a2enmod cgi
- 아파치를 다시 시작
sudo service apache2 restart
다음 스크립트를 생성하여 bash 스크립트를 실행할 수 있는지 확인하십시오.
/usr/lib/cgi-bin/test.sh
#!/bin/bash # get today's date OUTPUT="$(date)" USR=$(whoami) # headers echo "Content-type: text/plain" echo "" # body echo "Today is $OUTPUT" echo "Current user is $USR"
스크립트를 실행 가능하게 만듭니다
chmod +x /usr/lib/cgi-bin/test.sh
스크립트를 실행할 수 있는지 확인하면
curl localhost/cgi-bin/test.sh
다음 응답이 반환됩니다.Today is Wed Sep 6 12:19:34 PDT 2017 Current user is www-data
사용자가 www-data이기 때문에 해당 사용자를 sudoer로 추가합니다. 그런 다음
/etc/sudoers
끝에 다음 줄을 추가하여 파일을 수정합니다 .www-data ALL=(ALL) NOPASSWD: ALL
이제 해당 사용자는 루트 권한을 갖게 됩니다. 그런 다음 test.sh 스크립트를 다음과 같이 수정합니다.
#!/bin/bash # get today's date OUTPUT="$(date)" USR=$(sudo whoami)
그러면 get 요청을 다시 실행할 때 다음 응답이 표시됩니다
localhost/cgi-bin/test.sh
.Today is Wed Sep 6 12:28:38 PDT 2017 Current user is root