Назад | Перейти на главную страницу

как запускать команды оболочки из apache (через php)

Я использую redhat 6. У меня есть следующие команды оболочки, которые мне нужно запускать с веб-сервера (apache -> через php), которые в основном перемещают и перезаписывают файл, завершают процесс и запускают другой. Очевидно, по некоторым причинам все операции запрещены, поэтому мне интересно, есть ли способ их выполнить (например, какое разрешение и как я должен предоставить apache)

echo  shell_exec('mv -f /etc/resolv.test /etc/resolv.conf');
echo  shell_exec('killall horas');
echo  shell_exec('/xg/eng/sbin/startme &> /dev/null &');

журнал ошибок - mv: невозможно переместить /etc/resolv.test' to/etc/resolv.conf ': В доступе отказано horas (2105): Операция запрещена horas: ни один процесс не убит

Процессы Apache обычно выполняются от имени специального пользователя (обычно «apache» в Redhat). Узнай это первым. Затем вам необходимо убедиться, что этому пользователю разрешено выполнять эту операцию (разрешения для файлов / каталогов).

Очень опасно давать пользователю, который запускает веб-сервер, большие привилегии для выполнения конфиденциальных сценариев, которые должен выполнять только root. Я не знаю точно вашего сценария, но, судя по фрагменту, я бы предпочел что-то более осторожное, например, часто запускаемый (один раз в минуту) скрипт cron (возможно, для пользователя root), который просто проверяет наличие некоторого файла , который генерируется скриптом php - если файл присутствует, он выполняет задачу и удаляет файл.

хорошо, я знаю, что apache работает под apache, но я думаю, что вопрос в том, как предоставить больше разрешений для apache, чтобы он мог выполнять все эти команды

типичный способ сделать это - предоставить apache sudo доступ с NOPASSWD. вы должны быть слишком осторожны с этим, потому что это может быть чрезвычайно опасно при неправильной настройке. что-то вроде

apache    ALL=(ALL) NOPASSWD: killall horas

может работать. вы также можете написать все это как сценарий «обертку», а затем предоставить apache sudo доступ только к этому сценарию. (другой ответ рекомендует это тоже.)

помните, вы предоставляете apache как выполнение И повышение привилегий. потенциально это удаленный эксплойт корневого уровня. протестируйте свои скрипты перед его развертыванием и убедитесь, что вы исследуете безопасность доступа к странице с помощью базовой аутентификации и / или разрешенного IP. вам также может быть лучше исследовать альтернативные решения. действительно ли apache нужно управлять файлом resolv.conf? может ли cronjob выполнить killall?

Обычно я делаю одно из следующего:

  • Сделайте так, чтобы php обновлял базу данных и постоянно выполнял cronjob от имени правильного пользователя, который проверяет эту базу данных. Это приведет к задержке, но это безопаснее всего
  • Оберните все эти команды в сценарий оболочки и запустите apache sudo -u correctuser_here /path/to/script и, конечно же, добавьте для этого разрешения в / etc / sudoers: www-data ALL=correctuser /path/to/script
  • И мое любимое: используйте программное обеспечение для очередей (я неравнодушен к beanstalk, поскольку это просто): заставьте php добавить элемент в очередь и пусть демон в фоновом режиме будет постоянно извлекать и обрабатывать элементы.

В вашем сценарии использования вариант 2 кажется правильным.