
Eu tenho um servidor web que também reproduz rádio na Internet. Como usuário www-data, quero executar alguns comandos, por exemplo, fiz isso em/etc/sudoersarquivo:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer
E do PHP posso manipular o volume sem usar senha:
exec('sudo -u user amixer set Master 3%-');
E:
exec('sudo -u user amixer set Master 3%+');
Mas agora quero poder reiniciar meu próprio serviço executando o comando:
exec('sudo -u user service servicename restart');
Então eu tentei:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /bin/service
E isto:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, /bin/service
E mesmo isso:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer
www-data ALL=(ALL) NOPASSWD: /bin/service
Mas nenhum deles parece estar funcionando. Por favor, me ajude.
Desculpe pessoal - erro meu. Fiz algumas alterações, tentei vincular o formulário /sbin a /bin
Agora mudei para:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /usr/sbin/service
E funciona! Obrigado! Tópico encerrado.
Responder1
Cuidado com a sua solução: você pode iniciar, parar ou reiniciar qualquer serviço dessa forma!
É melhor criar um script de shell que execute este comando:
echo "#!/bin/sh' > /usr/bin/amixer_restart
echo "sudo -u user service amixer restart' >> /usr/bin/amixer_restart
Conceda permissões adequadas (550 significa que raiz e grupo www-data podem ler e executar, ninguém pode escrever)
sudo chown root:www-data /usr/bin/amixer_restart
sudo chmod 550 /usr/bin/amixer_restart
E permita que o Apache faça sudo neste script:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer_restart
Responder2
Isto é o que acabei fazendo:
- Instale o apache2 executando
sudo apt-get install apache2
- Certifique-se de que o Apache tenha permissão para executar scripts cgi executando
sudo a2enmod cgi
- Reinicie o Apache
sudo service apache2 restart
Verifique se consigo executar scripts bash criando o seguinte script em
/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"
tornar o script executável
chmod +x /usr/lib/cgi-bin/test.sh
Verifique se consigo executar o script
curl localhost/cgi-bin/test.sh
e recebo a seguinte resposta:Today is Wed Sep 6 12:19:34 PDT 2017 Current user is www-data
Como o usuário é www-data, adiciono esse usuário como um sudoer. Em seguida, modifico o arquivo
/etc/sudoers
adicionando esta linha no final:www-data ALL=(ALL) NOPASSWD: ALL
Agora esse usuário deve ter privilégios de root. Então modifico meu script test.sh como:
#!/bin/bash # get today's date OUTPUT="$(date)" USR=$(sudo whoami)
Então você deverá ver a seguinte resposta ao executar uma solicitação get novamente
localhost/cgi-bin/test.sh
:Today is Wed Sep 6 12:28:38 PDT 2017 Current user is root