Не могу изменить пользователей внутри system() в php
Моя команда
echo root_password | sudo -u root -S executable_full_path arguments
Я получаю сообщение об ошибке в браузере:
[sudo] пароль для www-данных: извините, попробуйте еще раз.
В phpinfo() безопасный режим отключен и отключенных функций нет. Почему это не работает? Эта же команда прекрасно работает в оболочке (bash). Escapeeshellarg и escapeshellcmd не имеют значения.
РЕДАКТИРОВАТЬ: просто возможность выполнить команду недостаточно. Выполняемая программа создает сокет в /tmp и должна назначить ему разрешения. Так что я думаю, что мне действительно нужно быть рутом для этого, возможно ли это?
3 ответа
Как предложил Альваро, я оставляю свой комментарий в качестве ответа. Мэтт, это позволило бы запустить эту команду от имени root.
@ Мат, не делай этого /etc/sudoers
(кстати, вы редактируете этот файл с visudo
команда, никогда напрямую) Таким образом, вы делаете возможным, что любой sudo whatever
Команда, запускаемая вашим веб-приложением, запускается пользователем root, что может значительно повысить интерес злоумышленника, если он обнаружит уязвимость в вашем приложении.
Если вы хотите запустить только одну команду от имени пользователя root без паролей, укажите это в /etc/sudoers
(Помните visudo
команды):
www-data ALL=(ALL) NOPASSWD: executable_full_path
Тогда вы только разрешаете выполнять только эту команду от имени пользователя root. Теперь вы должны быть в состоянии сделать
sudo -u root executable_full_path arguments
без необходимости вводить пароль (и он будет работать от имени пользователя root). Кроме того, это единственная команда, которую пользователь www-data может выполнить от имени пользователя root, поэтому она не должна быть опасной.
Вы повторяете пароль root, когда вы должны повторить пароль для www-data
,
Используйте это на вашем примере /ets/sudoers для запуска gconftool-2:
www-data ALL=NOPASSWD: /usr/bin/gconftool-2
www-data ALL=NOPASSWD: /usr/bin/sudo
www-data ALL=NOPASSWD: ALL