У меня есть сценарий 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
опять же, мои новые строки все еще там. Но только когда я сохраняю его снова, скрипт снова начинает работать.
Кто-нибудь может сказать мне, почему это может происходить? У меня есть две не очень удачные догадки:
sudo visudo
и это то, что позволяет моему скрипту работать (но только до истечения срока его действия).РЕДАКТИРОВАТЬ:
Я думаю, что использую неправильное имя пользователя ... Похоже, что для 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