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

#php #html #css

#php #файл-права доступа #chmod

Вопрос:

Я пытаюсь использовать PHP для создания файла, но он не работает. Я предполагаю, что это связано с тем, что у него нет доступа на запись (раньше это всегда было проблемой). Я попытался проверить, была ли это проблема, создав папку chmod 0777, но в итоге каждый скрипт в этом каталоге возвращал сообщение об ошибке 500, пока я не изменил его обратно. Как мне предоставить PHP доступ на запись в мою файловую систему, чтобы он мог создать файл?

Редактировать: он размещен на общем хостинге Hostgator с использованием Apache.

Редактировать 2: кто-то попросил код: код представляет собой скрипт GD image. Я знаю, что все остальное работает, поскольку ранее я создавал образ при каждом вызове ime. Теперь я пытаюсь создать их при добавлении нового текста и сохранить их в папке. У меня есть строка записи: imagejpeg(null,$file,85);

Я также создал тестовый файл, чтобы проверить, был ли это просто сломанный скрипт (в основном скопированный из tizag): http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (Я не знаю, правильно ли / как разместить здесь код. Вот содержимое PHP-скрипта, за вычетом PHP-тегов.)

Он возвращает 13,13,1 (отдельные строки), поэтому выглядит так, как будто он думает, что что-то написал, но testfile.txt является пустым (я загрузил пустой файл) или несуществующим (если я его удалю).

Редактировать 3: на сервере работает CentOS.

Комментарии:

1. Это сервер, которым вы управляете, или вы находитесь на общем сервере?

2. Общий хостинг Hostgator. Apache.

3. На какой ОС работает сервер? Если это Linux, вы должны убедиться, что пользователь apache (точное имя пользователя будет зависеть от ваших настроек — часто httpd или www-data в Linux) имеет доступ на запись в каталог. Вы можете изменить владельца на того же пользователя, что и apache (используя chown), и установить для владельца доступ на запись (например, «chmod 755»), или вы можете сделать его доступным для записи во всем мире (например, «chmod 777»).

4. @El Yobo: не делайте это 777 … давайте будем разумны в отношении chmod, пожалуйста.

Ответ №1:

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

 <?php
 $dir = 'myDir';

 // create new directory with 744 permissions if it does not exist yet
 // owner will be the user/group the PHP script is run under
 if ( !file_exists($dir) ) {
     mkdir ($dir, 0744);
 }

 file_put_contents ($dir.'/test.txt', 'Hello File');
  

Это избавит вас от хлопот с разрешениями.

Комментарии:

1. Правильно. Вы можете изменить разрешения в соответствии с вашими потребностями.

2. Это самое простое решение, хотя вы не должны использовать 777 в apache, поскольку он настроен на блокировку всех файлов.

3. Я получаю отказ в разрешении при создании каталога!

4. предполагается, что у вас есть доступ на запись к папке, в которой вы хотите создать myDir

Ответ №2:

Простое 3-шаговое решение

Аннотация: Вам нужно установить владельца каталога для пользователя, который использует PHP (пользователь веб-сервера).


Шаг 1: Определите пользователя PHP

Создайте PHP-файл, содержащий следующее:

 <?php echo `whoami`; ?>
  

Загрузите его на свой веб-сервер. Результат должен быть похож на следующий:

 www-data
  

Следовательно, пользователь PHP является www-data .


Шаг 2: Определите владельца каталога

Затем проверьте сведения о веб-каталоге с помощью командной строки:

 ls -dl /var/www/example.com/public_html/example-folder
  

Результат должен быть похож на следующий:

 drwxrwxr-x 2 exampleuser1 exampleuser2 4096 Mar 29 16:34 example-folder
  

Следовательно, владельцем каталога является exampleuser1 .


Шаг 3: Измените владельца каталога на пользователя PHP

После этого измените владельца веб-каталога на пользователя PHP:

 sudo chown -R www-data /var/www/example.com/public_html/example-folder
  

Убедитесь, что владелец веб-каталога был изменен:

 ls -dl /var/www/example.com/public_html/example-folder
  

Результат должен быть похож на следующий:

 drwxrwxr-x 2 www-data exampleuser2 4096 Mar 29 16:34 example-folder
  

Таким образом, владелец example-folder успешно был изменен на пользователя PHP: www-data .


Готово! Теперь PHP должен иметь возможность записывать данные в каталог.

Комментарии:

1. Здесь совершенно НЕ так, но другого способа связаться с вами не было: Спасибо за ваши усердные усилия по тегированию в Coffee SE!

2. @Stephie Нет проблем!

3. Очень хорошее пошаговое руководство, большое вам спасибо! Я бы добавил немного. Я решил проблему с записью файла в общую папку vagrant внутри машины vagrant, на которой работает apache, используя ваше руководство, но, во-первых, мне пришлось установить chmod -R 0777 в общую папку на моем локальном компьютере (который содержит машину vagrant).

4. Для меня это сработало отлично. Никаких изменений не требуется, чтобы заставить мой PHP-скрипт найти каталог, доступный для записи.

5. Это сработало очень хорошо! Это должно было быть принятым ответом.

Ответ №3:

Укажите владельца каталога для пользователя, выполняющего apache. Часто никто в linux

 chown nobody:nobody <dirname>
  

Таким образом, ваша папка не будет доступна для записи во всем мире, но все равно будет доступна для записи для apache 🙂

Комментарии:

1. Если вы используете Ubuntu, этот пользователь и группа не существуют. Какие-либо предложения по выполнению того, что вы здесь делаете?

2. @BrandonMinton ‘chown www-data:www-data <dirname>’ должен это сделать. www-data — пользователь apache в системах на базе debian

3. здравствуйте, вы сказали, что вам нужно chown nobody:nobody <dirname> , где я должен это закодировать?

4. @guitarlass вам нужно будет поместить эту команду в окно bash / ssh

5. иногда я не понимаю, почему что-то работает или не работает, когда дело доходит до разрешений, и я рад, что это только что сработало ….. горячая собака diggity.

Ответ №4:

1-й Выясните, какой пользователь владеет процессом httpd, используя следующую команду

 ps aux | grep httpd
  

вы получите ответ в несколько строк, подобный этому:

 phpuser   17121  0.0  0.2 414060  7928 ?        SN   03:49   0:00 /usr/sbin/httpd
  

Здесь в 1-м столбце показано имя пользователя. Итак, теперь вы знаете пользователя, который пытается записать файлы, что в данном случае phpuser
Теперь вы можете продолжить и установить разрешение для каталога, в который ваш php-скрипт пытается что-то написать:

 sudo chown phpuser:phpuser PhpCanWriteHere
sudo chmod 755 PhpCanWriteHere
  

Комментарии:

1. Вы должны использовать ps aux | grep apache2 в настоящее время.

Ответ №5:

Вы можете изменить права доступа к папке с помощью PHP chmod(). Дополнительная информация о том, как использовать команду, находится здесь: http://php.net/manual/en/function.chmod.php

Если вы получаете ошибку 500 при установке разрешений на 777 (доступно для записи во всем мире), то это означает, что ваш сервер настроен на предотвращение выполнения таких файлов. Это сделано по соображениям безопасности. В этом случае вы захотите использовать 755 в качестве самых высоких разрешений для файла.

Если в папке, в которой вы выполняете документ PHP, создается файл error_log, вы захотите просмотреть несколько последних записей. Это даст вам представление о том, где происходит сбой скрипта.

Для получения помощи в работе с файлами PHP я использую http://www.tizag.com/phpT/filewrite.php как ресурс.

Комментарии:

1. По умолчанию для папки уже установлено значение 0755. Я никогда не думал о проверке error_log, но я только что это сделал, и в нем ничего не говорится о том, почему не удалось создать файлы.

2. Возможно, было бы неплохо опубликовать код, с которым у вас возникли проблемы. Хорошим ресурсом, который я иногда использую для справки по синтаксису обработчика файлов, является tizag.com/phpT/filewrite.php .

Ответ №6:

Я узнал, что с HostGator вам нужно установить для файлов значение CMOD 644, а для папок — значение 755. Поскольку я сделал это на основе их технической поддержки, он работает с HostGator

Ответ №7:

Вы можете установить для selinux значение permissive для анализа.

     # setenforce 0
  

Selinux будет регистрироваться, но разрешать доступы. Итак, вы можете проверить /var/log/audit/audit.log подробности. Возможно, вам потребуется изменить контекст selinux. Для этого вы будете использовать chcon command . Если вам нужно, покажите нам свой audit.log более подробный ответ.

Не забудьте включить selinux после решения проблемы. Лучше, чтобы selinux применялся.

     # setenforce 1
  

Ответ №8:

У меня была та же проблема:

Поскольку я не хотел указывать 0777 в своем каталоге php, я создаю каталог tmp с правами 0777, где я создаю файлы, в которые мне нужно записывать.

Мой каталог php по-прежнему защищен. Если кто-то взломает каталог tmp, сайт продолжит работать в обычном режиме.

Ответ №9:

Лучший способ предоставить доступ на запись в каталог..

 $dst = "path/to/directory";
mkdir($dst); 
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {}  ");
  

Ответ №10:

chmod не позволяет вам устанавливать права собственности на файл. Чтобы установить право собственности на файл, вы должны использовать команду chown .

Ответ №11:

Я использую Ubuntu, и, как сказано выше, никто: никто не работает в Ubuntu. Вы получаете сообщение об ошибке:

 chown: invalid group: 'nobody:nobody'
  

Вместо этого вы должны использовать ‘nogroup’, например:

 chown nobody:nogroup <dirname>
  

Ответ №12:

Крошечный маленький намек!

echo whoami ;

убедитесь, что вы используете ОБРАТНЫЕ КАВЫЧКИ , А НЕ одинарные кавычки ‘ ‘ !

(конечно, теперь обратные кавычки не отображаются в этом редакторе! ну что ж, я пытался!)