como fazer uma reboot do linux a partir do arquivo php

Eu tenho um usuário brftv no meu sistema linux e tenho www-data que administra o nginx.

do terminal, posso deixar meu usuário brftv executar

sudo /sbin/reboot 

e funciona bem desde que eu adicionei o seguinte à seção “#user privilégio especificação do privilégio do usuário / etc / sudoers”:

 brftv ALL=NOPASSWD: /sbin/halt, /sbin/reboot, /sbin/poweroff www-data ALL=NOPASSWD: /sbin/halt, /sbin/reboot, /sbin/poweroff 

Mas quando meu arquivo php executa o seguinte código, nada acontece

 exec('nohup sudo -u brftv /sbin/reboot'); 

Eu adicionei a linha de dados www aos etc / sudoers acima no caso de ser necessário ao executar o exec anterior (), mesmo que eu o execute como -u brftv, mas não sou um especialista na linux, só pensei estar seguro apenas em caso).

O arquivo php que executa esse exec () é de propriedade de www-data, e chmod é 777, todos deveriam ter privilégio para executá-lo.

Eu tentei executar o arquivo php através do navegador (seria executado pelo usuário www-data que eu assumi) e do terminal $ php myFile.php .

——————- ATUALIZAR —————–

eu fiz isso

 sudo chmod us /sbin/reboot 

O que permite que todos os usuários no meu sistema executem o cmd de reboot sem senha. Isso funciona, mas eu não deixo isso aberto, então a outra solução com / etc / sudoers seria melhor, se alguém tivesse uma dica sobre o meu problema …

Eu segui este tut http://linux.byexamples.com/archives/315/how-to-shutdown-and-reboot-without-sudo-password/ e o segundo exemplo é praticamente o que eu obtive acima, que não funcionou para mim..

Solutions Collecting From Web of "como fazer uma reboot do linux a partir do arquivo php"

Gostaria de usar um programa C muito pequeno para conceder access apenas ao grupo PHP (provavelmente www-data no seu caso?), Use o bit suid no executável e exec o comando de reboot

phpreboot.c:

 #include  #include  #include  int main() { setuid(0); // for uid to be 0, root char *command = "/sbin/reboot"; execl(command, command, NULL); return 0; // just to avoid the warning (since never returns) } 

Compile-o

 gcc -Wall phpreboot.c -o phpreboot 

Mova phpreboot onde você deseja executá-lo (deve ser acessado por PHP!)

 mv phpreboot /home/private/ 

Como o root (ou via sudo ), assegure-se de que o proprietário é root e o grupo está configurado para www-data e altera os direitos para ter bit suid (nesta ordem)

 chown root:www-data phpreboot chmod 4750 phpreboot 

O resultado, ls -l phpreboot deve ser algo como (note the s in rws )

 -rwsr-x--- 1 root www-data 8565 Jun 12 11:42 phpreboot* 

Altere o script PHP para executar o phpreboot em vez disso

 exec ("/home/private/phpreboot"); // change the path! 

Apenas um executável minimo terá o suid para executar o programa de reboot , e somente o grupo PHP poderá executá-lo (e raiz, é claro).

  • Sobre o bit setuid e suid
  • PHP obtém o ID do grupo em execução e, em seguida, o Linux fazendo id groupID dá o nome do grupo.

Dar permissão de reboot para o www user é uma má idéia. Crie um cron e faça a reboot do sistema do cron em vez do script PHP. O Cron será executado a cada minuto e verifique se há reboot. Se estiver configurado, ele irá fazer a reboot.

1) escreva uma bandeira para um arquivo do seu programa php para que o cron possa decidir se deve reiniciar ou não.

  $Handle = fopen("/tmp/myfile", 'w'); fwrite($Handle, "doreboot"); fclose($Handle); 

2) Crie um script bash para ler esse arquivo e reinicie se o script PHP o solicitar.

 #!/bin/bash arg=$(head -n 1 /tmp/myfile) if [ "$arg" == "doreboot" ]; then >/tmp/myfile echo "Rebooting" echo 'password' | sudo -S reboot fi 

Execute isso no shell chmod +x mycron.sh

3) Configure o script no crontab

crontab -e e cole este

 * * * * * path/mycron.sh 

4) O usuário que configurou o cron deve ter permissão sudo. Adicione-o aos sudoers.

A única maneira que eu consegui que isso funcionasse no meu sistema era “puxá-lo” mudando chmod em / sbin / reiniciar como esse cara fez

http://linux.byexamples.com/archives/315/how-to-shutdown-and-reboot-without-sudo-password/

sudo chmod u + s / sbin / reiniciar

Eu percebo que isso pode não ser otimizado em muitos casos, mas este MediaPlayer está muito bloqueado, então não há access a um terminal para qualquer um de qualquer maneira.

Por que você colocou- -u brftv lá? Isso faz com que seu script PHP tente executar a reboot como seu usuário, o que não funcionará. Somente root pode reiniciar o sistema. Remova.

experimente este código exec (‘sudo shutdown -r now’);

ou “desligamento -r +5” desligamento após 5 minutos

Permitir Reboots From PHP:

  1. vim /etc/sudoers
  2. Listar item cole a nova linha ” %www-data ALL=NOPASSWD: /sbin/reboot ” e escrever mudanças.
  3. Reinicie o sistema operacional.
  4. Certifique-se de que seu script seja de propriedade de www-data, chown www-data:www-data filename.php (usuário apache)
  5. Execute o script

Apreciar 🙂

(testado no servidor ubuntu 14.40 LTS com php5-7, também deve funcionar em qualquer distro baseada em debian).

Experimente este código

 brftv ALL=NOPASSWD: /sbin/halt, /sbin/reboot, /sbin/poweroff www-data ALL=(brftv) NOPASSWD: /sbin/halt, /sbin/reboot, /sbin/poweroff 

então de php

 exec('sudo /sbin/reboot');