Выполнение команд с помощью sudo с использованием php - PullRequest
3 голосов
/ 21 декабря 2011

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

sudo ls /var/vmail/username/new | wc -l

Это прекрасно работает при запуске из оболочки (права доступа настроены и работают без указания пароля).

Но при запуске из PHP с использованием exec он выполняется как положено, но всегда возвращает 0.

Что может быть причиной этого?Как я могу отладить или устранить проблему?

(php 5.3, redhat, apache с ~ конфигурацией по умолчанию)

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

Спасибо ruaksдля чаевых.Проблема: sudo: sorry, you must have a tty to run sudo.Помогло комментирование записи в /etc/sudoers:

Defaults            requiretty
Defaults:apache     !requiretty

Но похоже, что это не очень хорошо для безопасности.Любое другое, лучшее решение?

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

Это, вероятно, потому что вы не настроили свои sudoers. Перейдите в / etc / sudoers и дайте разрешение www-data для выполнения скрипта. Так vim / etc / sudoers а затем вставить www-data ALL = (root) NOPASSWD: full / script / path.sh если вы хотите продолжить отладку, то при входе в систему от имени root выполните су www-данные а затем, как только вы войдете в систему как www-data, попробуйте запустить скрипт, который вы запускаете в php, и посмотрите, какую ошибку вы получите

2 голосов
/ 21 декабря 2011

При выполнении PHP через apache, процесс принадлежит тому пользователю, который запускает apache.См .: Как узнать, под каким пользователем работает Apache? Как уже упоминалось, для этого пользователя обычно существует угроза безопасности.

1 голос
/ 21 декабря 2011

Но, похоже, это не очень хорошо для безопасности.Любое другое, лучшее решение?

Да, это угроза безопасности.Я не знаю, насколько динамичной должна быть эта информация;если вы просто используете его время от времени и не возражаете, что он может быть немного устаревшим, вы можете написать cronjob, который выполнит команду и запишет вывод во временный файл, который может прочитать apache.

Если вам крайне необходимо, чтобы эта информация была точной на 100% и в режиме реального времени, вы можете выбрать другой способ определения количества новых сообщений.Если почтовый ящик читается с использованием, например, imap или чего-либо еще, в PHP есть функции, которые могут выполнять вычисления без необходимости использования sudo.В общем, мне все равно кажется, что это самый повторно используемый и «самый чистый» способ работы.

Добавление apache в файл sudo'ers - это риск для безопасности, но если вы добавите, он может толькоВыполните команду, которую хотите, чтобы она могла выполняться, как описано в Quillion, риски уменьшаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...