Вопрос или проблема
Я хочу выполнить команду командной строки от имени root из php файла. В моем случае я хочу просмотреть файл crontab на моей php странице.
Запуск команды sudo
в php не рекомендуется, и на моем raspberry pi с raspberry pi OS строка php
echo (shell_exec("sudo more /var/spool/cron/crontabs/pi"));
не работает. Поэтому я создал shell-скрипт:
crontab.sh
#!/bin/bash
echo "Start Crontab"
sudo more /var/spool/cron/crontabs/pi
echo "End Crontab"
и создал php страницу:
crontab.php
<?php
echo "Get Current User: " . get_current_user();
echo "<br>Who am I: ".(exec("whoami"));
echo "<br>";
echo (shell_exec("/var/www/html/cmd/crontab.sh"));
?>
Когда я выполняю crontab.sh в командной строке, кажется, что он работает, потому что я вижу текст crontab.
Когда я загружаю php страницу, я не вижу текст crontab. Я вижу только
Get Current User: pi
Who am I: www-data
Start Crontab End Crontab
Что я могу сделать?
У меня был cron, который использовал rsync
для копирования файла crontab -e
в файл cron.txt
каждый час. Это работало, но я не хочу просматривать (старую) копию.
редактирование: Моя проблема в том, что задача, начинающаяся с sudo, дает нулевой вывод. В комментариях я получил предложение использовать sudo crontab -l
. Это лучше, чем строка, которую я использовал, потому что она дает root crontab, а я просто не знал о решении с -l
. Но проблема все еще существует. Вывода нет.
Ок, я узнал, как выполнять задачу sudo в php (apache2) или в shell-скрипте, выполняемом из php (apache2).
Трюк заключается в использовании sudo visudo
.
Я много где встречал этот комментарий, но использовал его неправильно!
Скрипт, которому должно быть разрешено выполнять задачу sudo, не должен быть моим собственным .sh файлом, а должен иметь полный путь к команде.
Для crontab и пользователя www-data это:
www-data ALL=NOPASSWD: /usr/bin/crontab
Когда кто-то имеет ту же проблему, надеюсь, они найдут это быстрее, чем я.
Ответ или решение
Чтобы выполнить команду с использованием sudo
из PHP-скрипта, необходимо учитывать несколько важных нюансов, особенно касаемых безопасности и правильной настройки привилегий. В данном случае, задача заключается в выполнении команды sudo
, чтобы просмотреть crontab файл на Raspberry Pi. Давайте разберем порядок действий для решения этой проблемы шаг за шагом.
Обзор проблемы
При попытке выполнения команды через shell_exec
в PHP, возникает проблема с отсутствием вывода команды. Основные причины этого связаны с тем, что веб-сервер Apache, на котором выполняется PHP (с учетной записью www-data
), не имеет достаточных привилегий для выполнения команд от имени суперпользователя, где требуется sudo
.
Решение
Шаг 1: Настройка привилегий через visudo
Первое, что необходимо сделать, это настроить привилегии для пользователя www-data
, чтобы он мог выполнять команду crontab
без необходимости ввода пароля. Для этого нужно отредактировать конфигурацию sudoers. Следуйте этим шагам:
-
Откройте файл конфигурации sudoers с помощью команды:
sudo visudo
-
Добавьте следующую строку в конец файла для предоставления нужных привилегий:
www-data ALL=NOPASSWD: /usr/bin/crontab
Это позволит пользователю www-data
выполнять команду crontab
без необходимости ввода пароля. Важно убедиться, что вы указываете полный путь к команде, что повышает безопасность.
Шаг 2: Изменение PHP-скрипта
Теперь, когда установлены привилегии, вы можете использовать модифицированный PHP-скрипт для выполнения команды:
<?php
echo "Get Current User: " . get_current_user();
echo "<br>Who am I: " . (exec("whoami"));
echo "<br>";
echo (shell_exec("sudo /usr/bin/crontab -l"));
?>
Основное изменение здесь — использование sudo /usr/bin/crontab -l
для просмотра содержимого crontab. Убедитесь, что путь к команде совпадает с тем, что указан в sudoers.
Важные заметки
- Безопасность: Предоставление привилегий
NOPASSWD
может быть потенциальным риском безопасности. Убедитесь, что доступ к веб-серверу надежно защищен, и используйте такие настройки только в тех случаях, когда вы полностью осознаете возможные последствия. - Логи: Рекомендуется отслеживать логи для мониторинга вызовов скриптов и контроля за выполнением команд.
- Тестирование: Проверьте работу скрипта на тестовом сервере, перед развертыванием в рабочей среде.
Заключение
Предложенное решение позволяет успешно и безопасно выполнять команды с sudo
из PHP-скрипта, сохраняя возможность настраивать и мониторить выполнение задач через crontab на Raspberry Pi. Надеюсь, это руководство поможет вам разобраться с аналогичными задачами быстрее и эффективнее.