Как настроить PHP CLI на Linux Ubuntu для запуска в качестве www-данных?


12

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

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

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

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

или

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

Ответы:


23

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

sudo -u www-data php script.php

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

Что касается всегда запуска php как www-data, есть несколько возможностей. Вы можете создать простую оболочку. Если /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или подобном, каждой новой оболочке открытия позволит вам напрямую выполнить любые исполняемые файлы (+ х) $HOME/bin( /root/binдля корня).

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

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

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

Забавно, прошло полчаса, и я снова наткнулся на свой вопрос =) Кажется, я забыл принять твой ответ в прошлый раз - я только исправил это, спасибо!
Loostro

Метод псевдонимов имеет так много кровавого смысла, и он решил мою точную проблему
RedactedProfile

1

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


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

su www-data

Я все еще был бы заинтересован (если это возможно) в настройке PHP для запуска:

root@mycomp php (php script creating a file)

как пользователь root

приведет к созданию файла с www-данными: www-data user / group

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


1

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

chmod u+s /usr/bin/php

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

chmod 4755 /usr/bin/php

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


Вот почему я пойду с ответом
Риги

1

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


Это не относится к php-cli, не так ли?
Риха

1

создать файл скрипта:

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 этого скрипта

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.