как выполнить перезагрузку Linux из файла php

У меня есть пользовательский brftv на моей Linux-системе, и у меня есть www-данные, которые запускают nginx.

с терминала я могу позволить моему пользователю brftv запустить

sudo /sbin/reboot 

и он отлично работает, так как я добавил следующее в мою спецификацию «#user привилегии» файла / etc / sudoers:

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

Но когда мой php-файл запускает следующий код, ничего не происходит

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

Я добавил строку www-data в etc / sudoers выше, если это было необходимо при запуске вышеуказанного exec () (хотя я запускаю его как -u brftv, но я не специалист по Linux, просто подумал, что лучше быть в безопасности в случае).

Файл php, который запускает этот exec (), принадлежит www-data, а chmod – 777, поэтому у него должна быть привилегия выполнить его.

Я попытался запустить php-файл как через браузер (будет выполняться пользовательскими www-данными, которые я предполагаю), так и с терминала $ php myFile.php .

——————- ОБНОВИТЬ —————–

я сделал это

 sudo chmod us /sbin/reboot 

Это позволяет всем пользователям моей системы запускать reboot cmd без пароля. Он работает, но я не оставляю его открытым, поэтому другое решение с / etc / sudoers было бы лучше, если бы кто-то подсказывал, что моя проблема …

Я следил за этим тетом http://linux.byexamples.com/archives/315/how-to-shutdown-and-reboot-without-sudo-password/, а второй пример – это то, что я получил выше, что не работает для меня..

Я бы использовал очень небольшую программу на C, чтобы предоставить доступ только к группе PHP (вероятно, www-data в вашем случае?), Используйте бит suid в исполняемом файле и выполните команду перезагрузки

phpreboot.c:

 #include <stdlib.h> #include <sys/types.h> #include <unistd.h> 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) } 

Скомпилируйте его

 gcc -Wall phpreboot.c -o phpreboot 

Переместите phpreboot, где вы хотите его запустить (должен быть доступен PHP!)

 mv phpreboot /home/private/ 

Поскольку root (или через sudo ) гарантирует, что владелец root, а группа настроена на www-data и изменяет права на бит suid (в этом порядке)

 chown root:www-data phpreboot chmod 4750 phpreboot 

Результат: ls -l phpreboot должен быть чем-то вроде (обратите внимание на s в rws )

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

Измените PHP-скрипт для выполнения phpreboot

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

Только один крошечный исполняемый файл будет иметь suid для запуска программы перезагрузки , и только группа PHP сможет ее выполнить (и, конечно же, root ).

  • О битах setuid и suid
  • PHP получает идентификатор текущей группы, а затем в Linux, когда id groupID дает имя группы.

Предоставление разрешения на перезагрузку для www user – плохая идея. Создайте cron и перезагрузите систему из cron, а не из PHP-скрипта. Cron будет запускаться каждую минуту и ​​проверять флаг перезагрузки. Если он установлен, он перезагрузится.

1) напишите флаг в файл из вашей php-программы, чтобы cron мог решить, нужно ли перезагружать или нет.

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

2) Создайте скрипт bash для чтения этого файла и перезагрузитесь, если скрипт PHP скажет ему сделать это.

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

выполните это в shell chmod +x mycron.sh

3) Настройте скрипт в crontab

crontab -e и вставить это

 * * * * * path/mycron.sh 

4) Пользователь, установивший cron, должен иметь разрешение sudo. Добавьте его в суд.

Единственный способ, которым я получил это для работы в моей системе, – «взломать» его, изменив chmod on / sbin / reboot, как этот парень сделал

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

sudo chmod u + s / sbin / reboot

Я понимаю, что во многих случаях это может быть не оптимальным, но этот mediaPlayer очень сильно заблокирован, так что в любом случае доступ к терминалу для кого-либо еще невозможен.

Почему вы положили там -u brftv ? Это заставляет ваш PHP-скрипт запускать reboot качестве пользователя, что не сработает. Только root может перезагрузить систему. Убери это.

попробуйте этот код exec ('sudo shutdown -r now');

или «shutdown -r +5» после 5 минут

Разрешить перезагрузки с PHP:

  1. vim /etc/sudoers
  2. Элемент списка вставляет новую строку « %www-data ALL=NOPASSWD: /sbin/reboot » и записывает изменения.
  3. Перезагрузите ОС.
  4. Убедитесь, что ваш скрипт принадлежит www-данным, chown www-data:www-data filename.php (пользователь Apache)
  5. Запустить скрипт

Наслаждаться 🙂

(проверенный на сервере ubuntu 14.40 LTS с php5-7, должен также работать с любым дистрибутивом на основе debian.)

Попробуйте этот код

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

то из php

 exec('sudo /sbin/reboot');