
У меня есть веб-сервер, который также проигрывает интернет-радио. Как пользователь www-data я хочу запустить некоторые команды, например, я сделал это в/etc/sudoersфайл:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer
А с помощью PHP я могу управлять громкостью без использования пароля:
exec('sudo -u user amixer set Master 3%-');
И:
exec('sudo -u user amixer set Master 3%+');
Но теперь я хочу иметь возможность перезапустить свою собственную службу, выполнив команду:
exec('sudo -u user service servicename restart');
Итак, я попробовал:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /bin/service
И это:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, /bin/service
И даже это:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer
www-data ALL=(ALL) NOPASSWD: /bin/service
Но ни один из них, похоже, не работает. Пожалуйста, помогите мне.
Извините, ребята - моя ошибка. Я сделал некоторые изменения, пытался связать форму /sbin с /bin
Теперь я изменил это на:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /usr/sbin/service
И это работает! Спасибо! Тема закрыта.
решение1
Будьте осторожны с вашим решением: таким образом вы можете запустить, остановить или перезапустить любую службу!
Лучше создать скрипт оболочки, который запускает эту команду:
echo "#!/bin/sh' > /usr/bin/amixer_restart
echo "sudo -u user service amixer restart' >> /usr/bin/amixer_restart
Предоставьте соответствующие права (550 означает, что root и группа www-data могут читать и выполнять, никто не может писать)
sudo chown root:www-data /usr/bin/amixer_restart
sudo chmod 550 /usr/bin/amixer_restart
И разрешите Apache выполнить sudo для этого скрипта:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer_restart
решение2
Вот что я в итоге сделал:
- Установите apache2, запустив
sudo apt-get install apache2
- Убедитесь, что Apache разрешено запускать cgi-скрипты, выполнив команду
sudo a2enmod cgi
- Перезапустить апач
sudo service apache2 restart
Проверьте, могу ли я запускать скрипты bash, создав следующий скрипт по адресу
/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"
сделать скрипт исполняемым
chmod +x /usr/lib/cgi-bin/test.sh
Проверяю, могу ли я выполнить скрипт.
curl localhost/cgi-bin/test.sh
Получаю следующий ответ:Today is Wed Sep 6 12:19:34 PDT 2017 Current user is www-data
Поскольку пользователь www-data, я добавляю этого пользователя как sudoer. Затем я изменяю файл,
/etc/sudoers
добавляя эту строку в конец:www-data ALL=(ALL) NOPASSWD: ALL
Теперь этот пользователь должен иметь права root. Затем я изменяю свой скрипт test.sh следующим образом:
#!/bin/bash # get today's date OUTPUT="$(date)" USR=$(sudo whoami)
Затем вы должны увидеть следующий ответ при выполнении запроса get снова
localhost/cgi-bin/test.sh
:Today is Wed Sep 6 12:28:38 PDT 2017 Current user is root