Я использую 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
?
Обычно я делаю одно из следующего:
sudo -u correctuser_here /path/to/script
и, конечно же, добавьте для этого разрешения в / etc / sudoers: www-data ALL=correctuser /path/to/script
В вашем сценарии использования вариант 2 кажется правильным.