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

Как настроить PHP CLI на Linux ubuntu для работы как www-data?

У меня на Ubuntu установлено приложение symfony2. В Symfony есть множество полезных консольных команд (например, php app/console cache:clear или php app/console assets:install web).

Проблема в том, что если я запустил их как root пользователь, вновь созданные файлы будут иметь root:root пользователь / группа, и если я захожу на свой веб-сайт, я получаю ошибки (поскольку apache не может читать / изменять эти файлы -> они должны иметь www-data:www-data).

Бег chown www-data:www-data решает проблему, но запускать его каждый раз, когда я очищаю кеш, не является решением.

Как я могу настроить PHP CLI, чтобы он всегда работал как пользователь / группа www-data?

или

Как я могу запустить команду как другой пользователь (будучи root, запускать ее как www-data)?

Выполните команду от имени другого пользователя один раз:

sudo -u www-data php script.php

Это должно сработать, если вы root.

Что касается постоянного запуска php как www-data, есть несколько возможностей. Вы можете создать простую оболочку shellscript. Если /usr/bin/php это всего лишь софт-ссылка на /usr/bin/php5 или что-то подобное, что упрощает работу. Просто замените софт-ссылку (НЕ файл php5) с таким скриптом:

#!/bin/sh

sudo -u www-data php5 $*

return $?

Однако это не проверено. Также имейте в виду, что это ВСЕГДА будет пытаться запустить php5 как пользователь www-data, даже если пользователь не может быть root и может не иметь на это разрешения. И это также может быть не то, что вам действительно нужно. Некоторые установленные службы могут столкнуться с проблемами при попытке запустить php.

Решение (возможно, лучшее) применить это только к root может заключаться в том, чтобы оставить софт-ссылку /usr/bin/php в одиночку и поместите сценарий в /root/bin вместо. Затем добавьте эту папку в PATH через .bashrc, .profile или похожие. Если у вас есть /etc/skel/.profile, который может указать, как это делается:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Как только это будет в вашем .bashrc, .profile или аналогичный, каждая новая открываемая вами оболочка позволит вам напрямую выполнять любые исполняемые файлы (+ x) в $HOME/bin (/root/bin для рута).

Подсказка: вы можете назвать сценарий оболочки примерно так: phpwww поэтому вы явно указываете php script.php или phpwww script.php чтобы решить, нужен ли вам обычный php.

Другое решение - простой псевдоним. Поместите это в свой .bashrc, .profile или похожие:

alias phpwww='sudo -u www-data php'

создать файл сценария:

touch /usr/bin/phpuid
chmod +x /usr/bin/phpuid

добавить содержание:

#!/bin/bash

UIDX="#"`stat -c '%u' $1`
sudo -u $UIDX php5 $*

запустите свои скрипты от root:

phpuid /path/to/script.php

или используйте интерпретатор в своих скриптах

#!/usr/bin/phpuid
<?php
phpinfo();

примечание: протестировано на debian 7, вам может потребоваться установить sudo

apt-get install sudo

все файлы, созданные script.php, будут иметь тот же uid этого скрипта

если у вас есть php-fpm (FastCGI Process Manager)
вы можете настроить его в конфигурационном файле, расположенном по адресу (по крайней мере, для centos): /etc/php-fpm.d/www.conf
в строке 39 вы можете установить пользователя, а в строке 49 вы установите группу

Я бы попытался сделать / usr / bin / php владельцем www-data и установить разрешение suid, которое заставляет команду выполняться владельцем файла. Вы бы сделали это с помощью:

chmod u+s /usr/bin/php

вам нравится восьмеричная запись:

chmod 4755 /usr/bin/php

Хотя я должен сказать, что это должно вызывать беспокойство всякий раз, когда вы делаете www-data владельцем чего-либо, поскольку цель учетной записи www-data состоит в том, чтобы владеть как можно меньше.

Ответил mwargh на ## linux (IRC Freenode.net)


Чтобы запустить команду от имени другого пользователя -> переключитесь на этого пользователя, используя:

su www-data

Мне все равно было бы интересно (если это возможно) настроить PHP так, чтобы он работал:

root@mycomp php (php script creating a file)

так как корень пользователь

приведет к созданию файла с www-data: www-data группа пользователей

(таким образом мне не пришлось бы переключаться с root на www-data для выполнения моих команд)