Выполнение shell-скрипта с использованием sudo из PHP.

Вопрос или проблема

Я хочу выполнить команду командной строки от имени 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. Следуйте этим шагам:

  1. Откройте файл конфигурации sudoers с помощью команды:

    sudo visudo
  2. Добавьте следующую строку в конец файла для предоставления нужных привилегий:

    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. Надеюсь, это руководство поможет вам разобраться с аналогичными задачами быстрее и эффективнее.

Оцените материал
Добавить комментарий

Капча загружается...