Запуск Bash скрипта с sudo php — CentOS

Опубликовано

Сегодня пол вечера убил на проблему, которая и не должны была существовать. Необходимо было выполнить внешний bash скрипт файл из PHP. Всего бы ничего, но исполняемый файл необходимо было запустить от Рута.

Поэтому сначала нужно было поставить sudo, так как в системе его не было установлено.

Sudo — это программа, разработанная в помощь системному администратору и позволяющая делегировать те или иные привилегированные ресурсы пользователям с ведением протокола работы. Основная идея — дать пользователям как можно меньше прав, но при этом достаточно для решения поставленных задач (wiki).

Для установки sudo необходимо выполнить вот такую команду

 yum install sudo

Все отлично, пакет установился, теперь идем в файл «/etc/sudoers» и прописываем вот такую строчку. Если вы используете Debian-based систему, то пользователь будет www-data.

apache ALL=NOPASSWD:<путь к вашему скрипту>

Это позволит Апачу выполнять этот скрипт от рута без запроса пароля, что мне и было необходимо.
Если у Вас возникает ошибка «sudo: sorry, you must have a tty to run sudo» , то необходимо закомментировать строчку Defaults requiretty

# Defaults requiretty

Вообще sudo очень полезная штука, через нее можно указывать список разрешенных команд для каждого пользователя (или группы пользователей), файлы, доступные для редактирования, специальные переменные окружения и многое другое.

Более подробно об этом можно прочитать в документации (man sudo)

Казалось бы, вот и все, теперь остается в PHP скрипте прописать вот такую строчку, и все должно было работать. (Во всяком случае на Debian уже хватало этого)

    exec( 'sudo ' . '<путь к исполняемому bash скрипту >', $query, $returnValue);

Но не тут то было, скрипт упорно не выполнялся выдавая мне вот такую ошибку
«sudo: can’t stat /var/run/sudo: Permission denied».
Я уже и open_basedir отключал у хоста, и отключал Suhosin Patch — ничего не помогало. Проблему не мог решить порядком часа 2-3. Все таки в новой системе не сразу до всего догадаешься.

Немного покопавшись на немецких форумах (гугль завел туда (: ) оказалось, нужно было отключить параметр SELINUX, который находится в файле «/etc/selinux/config»

SELINUX=disabled

После изменения этого параметра необходимо перезагрузить систему.

Теперь скрипт исполнялся как надо и проблема была решена. Каких только «подводных камней» не найдешь в незнакомой системе CentOS.

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VK
  • Отключи SELINUX и получи абсолютно дырявую машину. Ура!

  • «Не удалось открыть файл блокировки….» — так как он уже существует?