В контексте более масштабных усилий я столкнулся с конкретной проблемой, которая меня сбивает с толку.
В Mac OS X 10.6.7, используя систему, предоставленную Apache и PHP, я создал простой HelloWorld.php
сценарий, который, не удивительно, просто печатает Hello, World!
и ничего больше.
Прекрасно работает, если я выполняю его как php helloworld.php
.
Однако если я:
sudo su
su _www php helloworld.php
Он ничего не излучает; php
возвращается практически сразу без признаков казни.
Где я сошел с рельсов (и, что более важно, какую диагностическую информацию я должен собирать, чтобы определить проблему)?
Никаких кубиков.
bash-3.2$ls -alF foo.php
-rw-r--r-- 1 _www _www 37 Apr 4 21:08 foo.php
bash-3.2$ ls -dalF .
drwxr-xr-x 56 _www _www 1904 Apr 4 21:08 ./
bash-3.2$ whoami
bbum
bash-3.2$ php foo.php
Hello, World!
bash-3.2$ sudo sh
sh-3.2# php foo.php
Hello, World!
sh-3.2# su _www php foo.php
sh-3.2#
Если я скопирую foo.php
в корень документов моего веб-сервера, он работает. Как это происходит в корневом каталоге моего пользователя; он отлично работает через веб-сервер, независимо от местоположения.
Четный su _www php -v
ничего не изрыгает. Здесь что-то подозрительное.
Дерп. Пользователь _www просто арестован; без оболочки. При запуске из оболочки портит даже самые простые команды.
Это очень похоже на мой вопрос "Запустить cgi-script в командной строке от имени пользователя www?" (FreeBSD).
Проблема вот в чем: у пользователя _www установлена оболочка /usr/bin/false
. Согласно man-странице «Ложная утилита всегда завершается с ненулевым кодом выхода». su _www
всегда будет терпеть неудачу, по замыслу.
Это сделано из соображений безопасности. Если кому-либо удалось успешно запустить удаленный эксплойт против _www, учетной записи, которая используется для запуска ваших веб-приложений, то он столкнется с оболочкой, которая немедленно завершится. Если бы эта оболочка оставалась чем-то вроде /bin/sh
, то пользователь _www сможет запускать множество команд в командной строке, а это плохо для безопасности. Таким образом, он установлен на /usr/bin/false
чтобы ограничить ущерб, причиненный любыми взломами на вашем веб-сервере. Отключать это неразумно.
Однако установка оболочки _www на /usr/bin/false
также означает, что пользователь «_www» не может выполнять команды в командной строке. Даже простая команда вроде whoami
не удастся:
# su _www whoami
# echo $?
1
Решение тоже использовать sudo
не su
. Этот простой пример показывает, что теперь я могу выполнять простые команды как пользователь _www:
# sudo -u _www id
uid=70(_www) gid=70(_www) groups=70(_www)
Вам также необходимо убедиться, что пользователь _www может читать файл. Но если вы можете выполнить этот файл с помощью веб-сервера Apache, значит, разрешения уже верны.
Первое, на что нужно обратить внимание, - это права доступа к файлу. Как правило, веб-файлы должны принадлежать пользователю Apache.
попробуйте chown _www: _www helloworld.php
затем попробуйте запустить php от имени пользователя _www.