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



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



изменить: он размещен на общем хостинге Hostgator с помощью Apache.



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



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



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



изменить 3: сервер работает CentOS.

2295   11  

11 ответов:

очень простой способ-позволить 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');

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

установите владельца каталога для пользователя, работающего под управлением apache. Часто никто на linux

chown nobody:nobody <dirname>

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

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

Простое 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 должен иметь возможность писать в каталог.

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

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

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

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

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

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

    # setenforce 0

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

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

    # setenforce 1

chmod не позволяет установить права собственности на файл. Для установки владельца файла необходимо использовать команду chown.

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

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

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

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

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

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

chown: invalid group: 'nobody:nobody'

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

chown nobody:nogroup <dirname>

Comments

    Ничего не найдено.