Как предоставить PHP доступ для записи к определенным каталогам, созданным git?

Здесь есть несколько похожих вопросов, , таких как этот, но ответ на этот вопрос (и несколько других, которые я читал):

пусть PHP сам создаст каталог в первую очередь.

Я использую git на своем сайте, поэтому PHP не может «сам создать каталог».

Чтобы внести изменения, я запускаю команду git pull origin master при входе на свой сервер через SSH, что делает владельца файлов моим пользователем cpanel, под которым я зарегистрирован.

Мне нужно, чтобы PHP мог создавать файлы в определенных каталогах. Это единственный способ разрешить это chmod папкам 777, или есть лучший способ?

Я плохо разбираюсь в разрешениях Linux, но из того, что я читал, изменение прав доступа к каталогам и файлам на 777, как правило, не очень хорошая идея. Кроме того, если я chmod перенесу папки в 777, я подозреваю, что разрешения будут перезаписаны при запуске git pull origin master, хотя я этого не проверял.


person Nate    schedule 13.02.2015    source источник
comment
Используйте shell_exec для создания файлов и каталогов   -  person Daan    schedule 13.02.2015
comment
@Daan Как уже упоминалось, я использую git. Он создает каталоги и файлы.   -  person Nate    schedule 13.02.2015
comment
Вы можете указать каталоги для пользователя, от имени которого работает веб-сервер. Но я думаю, что необходимость писать что-либо в git checkout довольно схематична. Я бы рекомендовал поместить эти файлы вне корня документа, чтобы они были физически отделены от файлов git.   -  person Alex Howansky    schedule 13.02.2015
comment
@AlexHowansky Ну, в этом случае мне нужен скрипт генератора карты сайта, который я написал для записи файлов карты сайта в каталог public_html. Я также хотел бы иметь возможность записывать туда определенные файлы журналов, чтобы я мог просматривать их в своем браузере.   -  person Nate    schedule 13.02.2015
comment
Хорошо, но генератор карты сайта не предназначен для работы в режиме реального времени (не так ли?) и может запускаться из cron как пользователь, у которого уже есть права на запись — вы не хотите, чтобы кто-либо в Интернете мог отключить ваш сценарии обслуживания. Что касается журналов, если вы должны иметь к ним доступ через Интернет, просто не помещайте их в каталог, который уже создан git - поместите их в новый, тогда не о чем беспокоиться.   -  person Alex Howansky    schedule 13.02.2015
comment
Еще лучше, поместите журналы в новый каталог, который находится за пределами корня документа, создайте символическую ссылку на него из корня документа, а затем убедитесь, что ваш веб-сервер настроен так, чтобы никогда не выполнять PHP из этого каталога.   -  person Alex Howansky    schedule 13.02.2015


Ответы (2)


  1. Git не будет переопределять разрешения для уже существующих каталогов.
  2. Вы должны проверить, под каким user apache (или любым другим http-сервером, который вы используете).

Скорее всего, www-data для apache:

ps aux | grep http | cut -f 1 -d ' '
  1. Как только вы узнаете пользователя, под которым работает https-сервер, смените владельца.

Эта команда оболочки в порядке:

chown -R www-data FOLDER_PHP_NEEDS_TO_WRITE_TO

Приведенное выше установит владельца папки www-data, по-видимому, дав разрешение на запись для https-сервера для записи туда.

Если вы боитесь потерять контроль над этим каталогом, сделайте это через разрешение group:

chgrp -R www-data FOLDER_PHP_NEEDS_TO_WRITE_TO
chmod -R g+w FOLDER_PHP_NEEDS_TO_WRITE_TO

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

Другой вариант — запустить git как www-data:

sudo runuser -l  www-data -c 'git pull'

Но я бы предложил решение с группой.

person Aleksei Matiushkin    schedule 13.02.2015
comment
если я chown передам папку другому пользователю, не повлияет ли это на возможность git обновлять файлы в папке, а также на мою возможность редактирования через ftp? - person Nate; 13.02.2015
comment
Примечание. Это плохая идея, если FOLDER_PHP_NEEDS_TO_WRITE_TO не пуста, так как процесс вашего веб-сервера теперь имеет доступ для изменения ее содержимого. - person Alex Howansky; 13.02.2015
comment
@AlexHowansky Бьюсь об заклад, папки делаются доступными для записи веб-серверами, чтобы веб-серверы могли записывать в эти папки :) - person Aleksei Matiushkin; 13.02.2015
comment
Да, я понимаю намерение, но если эта папка уже содержит (например) PHP-код из репозитория git, то вы только что дали веб-сайту возможность перезаписать свой собственный источник. Вот почему, как правило, вы никогда не хотите, чтобы что-либо в корневом каталоге документа было доступно для записи процессу веб-сервера. - person Alex Howansky; 13.02.2015

Это может быть то, что вы можете использовать - я сам не пробовал, поэтому не знаю, действительно ли это работает:

https://stackoverflow.com/a/3208143/609855

person h00ligan    schedule 13.02.2015