У меня на 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
решает проблему, но запускать его каждый раз, когда я очищаю кеш, не является решением.
или
Выполните команду от имени другого пользователя один раз:
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 состоит в том, чтобы владеть как можно меньше.
Чтобы запустить команду от имени другого пользователя -> переключитесь на этого пользователя, используя:
su www-data
Мне все равно было бы интересно (если это возможно) настроить PHP так, чтобы он работал:
root@mycomp php (php script creating a file)
так как корень пользователь
приведет к созданию файла с www-data: www-data группа пользователей
(таким образом мне не пришлось бы переключаться с root на www-data для выполнения моих команд)