cómo hacer un reinicio de Linux desde el archivo php

Tengo un usuario brftv en mi sistema Linux y tengo www-data que ejecuta el nginx.

desde la terminal puedo dejar que mi usuario brftv se ejecute

sudo /sbin/reboot 

y funciona bien ya que agregué lo siguiente a la sección “# privilegio de privilegios de usuario” de mi archivo / etc / sudoers:

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

Pero cuando mi archivo php ejecuta el siguiente código, no pasa nada

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

Agregué la línea www-data a los etc / sudoers anteriores en caso de que fuera necesario al ejecutar el exec anterior () (aunque lo ejecuto como -u brftv, pero no soy un experto en Linux, solo pensé que sería mejor estar seguro solo en caso).

El archivo php que ejecuta este exec () es propiedad de www-data, y chmod es 777, todos deben tener privilegios para ejecutar desde allí.

He intentado ejecutar el archivo php a través del navegador (lo ejecutaría el usuario www-data, supongo) y desde el terminal $ php myFile.php .

——————- ACTUALIZACIÓN —————–

hice esto

 sudo chmod us /sbin/reboot 

Lo que permite a todos los usuarios de mi sistema ejecutar el cmd de reinicio sin contraseña. Funciona, pero prefiero no dejarlo así, así que la otra solución con / etc / sudoers sería mejor, si alguien tuviera una pista sobre cuál es mi problema …

Seguí este tut http://linux.byexamples.com/archives/315/how-to-shutdown-and-reboot-without-sudo-password/ y el segundo ejemplo es más o menos lo que obtuve arriba que no funcionó para mi..

Solutions Collecting From Web of "cómo hacer un reinicio de Linux desde el archivo php"

Usaría un progtwig C muy pequeño para otorgar acceso solo al grupo PHP (probablemente www-data en su caso?), Use el bit suid en el ejecutable y ejecute el comando de reinicio

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) } 

Comstackrlo

 gcc -Wall phpreboot.c -o phpreboot 

Mueve phpreboot donde quieras ejecutarlo (¡tiene que ser accesible por PHP!)

 mv phpreboot /home/private/ 

Como root (o vía sudo ), asegúrese de que el propietario sea root y group esté establecido en www-data , y cambie los derechos para que tenga suid bit (en este orden)

 chown root:www-data phpreboot chmod 4750 phpreboot 

El resultado, ls -l phpreboot debería ser algo así como (tenga en cuenta los s en rws )

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

Cambie el script PHP para ejecutar phpreboot en su lugar

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

Solo un pequeño ejecutable tendrá el suid para ejecutar el progtwig de reinicio , y solo el grupo PHP podrá ejecutarlo (y la raíz, por supuesto).

  • Acerca de setuid y suid bit
  • PHP obtiene el ID del grupo en ejecución y luego en Linux haciendo id groupID da el nombre del grupo.

Dar permiso de reinicio al www user es una mala idea. Cree un cron y reinicie el sistema desde el cron en lugar del script de PHP. El Cron se ejecutará cada minuto y verificará si hay un indicador de reinicio. Si está configurado, hará el reinicio.

1) escribe una bandera en un archivo de tu progtwig php para que el cron pueda decidir si reiniciar o no.

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

2) Cree un script bash para leer ese archivo y reinícielo si el script PHP le dice que lo haga.

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

ejecutar esto en shell chmod +x mycron.sh

3) Configure el script en crontab

crontab -e y pegar esto

 * * * * * path/mycron.sh 

4) El usuario que configuró el cron debería tener el permiso de sudo. Agrégalo a sudoers.

La única forma en que logré que esto funcionara en mi sistema fue “piratearlo” cambiando chmod on / sbin / reiniciar como lo hizo este tipo

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

sudo chmod u + s / sbin / reiniciar

Me di cuenta de que esto podría no ser óptimo en muchos casos, pero este MediaPlayer está muy bloqueado, por lo que no hay acceso a una terminal para nadie más.

¿Por qué pusiste -u brftv allí? Eso hace que su script PHP intente ejecutar el reboot como su usuario, lo que no funcionará. Solo root puede reiniciar el sistema. Eliminarlo

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

o “shutdown -r +5” apagado después de 5 minutos

Permitir reinicios desde PHP:

  1. vim /etc/sudoers
  2. El elemento de la lista pega la nueva línea ” %www-data ALL=NOPASSWD: /sbin/reboot ” y escribe los cambios.
  3. Reiniciar el sistema operativo.
  4. Asegúrese de que su script sea propiedad de www-data, chown www-data:www-data filename.php (usuario de apache)
  5. Ejecutar guión

Disfruta 🙂

(probado en el servidor ubuntu 14.40 LTS con php5-7, también debería funcionar en cualquier distribución basada en Debian).

Prueba este código

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

luego de php

 exec('sudo /sbin/reboot');