У меня есть пользовательский 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 ).
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:
vim /etc/sudoers
%www-data ALL=NOPASSWD: /sbin/reboot
» и записывает изменения. chown www-data:www-data filename.php
(пользователь Apache) Наслаждаться 🙂
(проверенный на сервере 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');