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

Сценарию PHP требуется разрешение на запуск команды sudo с помощью shell_exec ()

У меня есть сценарий PHP, который содержит shell_exec() а команда, которую он выполняет, обычно требует sudo. Я отредактировал sudoers с помощью visudo, чтобы они содержали следующее:

www-data ALL = NOPASSWD: /var/root/node/npm/node_modules/less/
%users ALL = NOPASSWD: /var/root/node/npm/node_modules/less/

Я подозреваю, что любой из них должен сработать, но для уверенности я выбрал подход с ремнями и подтяжками.

Я редактирую etc / sudoers с помощью vim, поэтому после добавления этих строк я делаю: x, и все работает. Мой PHP-скрипт делает то, что должен ... около 10-15 минут. Потом скрипт перестает работать. В частности, shell_exec() перестает работать.

Если я сделаю sudo visudo опять же, мои новые строки все еще там. Но только когда я сохраняю его снова, скрипт снова начинает работать.

Кто-нибудь может сказать мне, почему это может происходить? У меня есть две не очень удачные догадки:

  1. Есть своего рода льготный период, который начинается, когда я sudo visudo и это то, что позволяет моему скрипту работать (но только до истечения срока его действия).
  2. Новые данные в etc / sudoers остаются в sudoers.tmp ("файл блокировки") ... Мне ни один из них не подходит.

РЕДАКТИРОВАТЬ:

Я думаю, что использую неправильное имя пользователя ... Похоже, что для MAMP пользователь apache на самом деле мой пользователь (не www-data). Я знаю это, потому что добавил это в свой PHP-скрипт: echo = shell_exec("whoami"); Появится мое имя пользователя: Emerson. Значит ли это, что я должен добавить Emerson ALL = NOPASSWD: /var/root/note/npm/node_modules/less/bin/lessc в мой файл sudoers?

РЕДАКТИРОВАТЬ:

У меня это работает с этим в моем файле sudoers. Emerson ALL=(ALL) NOPASSWD: ALL Это работает, но я не думаю, что так должно быть. Помимо множества избыточностей, это еще и слишком снисходительно. Я оставил всю ерунду, чтобы вы могли видеть, что у меня сейчас есть.

#

# Host alias specification

# User alias specification

# Cmnd alias specification

# Defaults specification
Defaults        env_reset
Defaults        env_keep += "BLOCKSIZE"
Defaults        env_keep += "COLORFGBG COLORTERM"
Defaults        env_keep += "__CF_USER_TEXT_ENCODING"
Defaults        env_keep += "CHARSET LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE"
Defaults        env_keep += "LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME"
Defaults        env_keep += "LINES COLUMNS"
Defaults        env_keep += "LSCOLORS"
Defaults        env_keep += "SSH_AUTH_SOCK"
Defaults        env_keep += "TZ"
Defaults        env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"
Defaults        env_keep += "EDITOR VISUAL"
Defaults        !requiretty

# Runas alias specification

# User privilege specification
root    ALL=(ALL) ALL
%admin  ALL=(ALL) ALL
Emerson ALL=(ALL) NOPASSWD: ALL

# Uncomment to allow people in group wheel to run all commands
# %wheel        ALL=(ALL) ALL

# Same thing without a password
 %wheel ALL=(ALL) NOPASSWD: ALL

# Samples
# %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users  localhost=/sbin/shutdown -h now

#Allow PHP to compile .less files
www-data ALL = NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
%users ALL = NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
Emerson ALL =(ALL) NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
apache ALL =(ALL) NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc

Здесь не проблема ни в одном из предложенных вами вещей.

Есть ли у вас в файле sudoers строка requiretty? Это объяснило бы, почему это работает для вас, но не для вашего PHP-скрипта. Удаление этого устранит проблему.

Sudo, возможно, был настроен на кеширование вашего пароля на 15 минут, проверьте наличие строки типа «Defaults timestamp_timeout = XXXX» в вашем файле sudoers.

Один совет: подумайте об ограничении sudo только необходимыми файлами. Что, если злоумышленнику удастся поместить вредоносный файл в ваш каталог node_modules / less /?

Вы должны авторизовать пользователя, которому вы хотите разрешить повышенные привилегии в файле sudoers. Если ваш веб-сервер работает как Emerson затем

Emerson ALL = NOPASSWD: /var/root/note/npm/node_modules/less/bin/lessc

должен решить вашу проблему.

Вы должны отключить requiretty для веб-пользователя

Вот синтаксис для / etc / sudoers

Defaults:username !requiretty

Не редактируйте / etc / sudo с помощью vim, используйте команду visudo