PHP: Установка разрешений, чтобы я мог написать файл? - PullRequest
1 голос
/ 03 июня 2009

Я пытаюсь создать файл с PHP, вот мой код:

$file_to_send = 'ftp_test_from_created_file.txt';
chmod($file_to_send, 0777);
$fh = fopen($file_to_send,'w');
$tsv_line = 'Hey\tThese\tAre\tTab\tSeperated\tValues';
fwrite($fh, $tsv_line);
fwrite($fh, '\n');
$tsv_line = 'Hey\tThese\tAre\tToo';
fwrite($fh, $tsv_line);
fclose($fh);

Это явно дает мне ошибку, потому что я пытаюсь установить разрешения для файла, который еще не существует. Хотя, если я пропущу вызов chmod, я получу еще одну ошибку, сообщающую, что у меня не установлены разрешения. Так что я либо нахожусь в цикле "курица против яйца", либо мне нужно установить разрешения для директории с содержимым ... но как? он перепробовал все из фоллинга:

chmod('../containingfolder/', 0777);
chmod('../', 0777);
chmod('', 0777);

Ничего из того, что работает ... что мне делать? Да, и, кстати, как только я закончу, мне нужно поменять разрешения обратно?

Спасибо!

ОБНОВЛЕНИЕ Я пытался chmod ('.', 0777) , и это ошибка, которую я получил:

Warning: chmod(): Operation not permitted

Единственная причина, по которой я пытаюсь создать этот файл, заключается в том, что я могу отправить его по FTP где-то еще, тогда я планировал отсоединить его (). Так есть ли лучший способ? Например, хранить файл в памяти для отправки (не знаю, возможно ли это)? Также я использую PHP4. Спасибо!

Ответы [ 6 ]

1 голос
/ 03 июня 2009

Возможно также, что работающий сервер apache (если это apache) не имеет доступа для изменения разрешений для этого каталога. Он может иметь root / root в качестве пользователя / группы, и apache запускается в группе apache, wwwuser или в другом месте.

Сделайте ls -l в родительском каталоге и посмотрите, какие пользователи и группы имеют доступ к этой папке.

0 голосов
/ 03 июня 2009

Если вы хотите сохранить chroot-джейл, но все еще нуждаетесь в привилегиях chmod для текущего каталога, вам нужно будет выяснить, как использовать sudo с опцией -S, и передать корневой пароль в STDIN, чтобы чтобы получить привилегии.

0 голосов
/ 03 июня 2009

Если текущий пользователь может писать в каталог, вы сможете упростить все это с помощью file_put_contents().

<?php
$file = 'file_to_write.txt';
$data = "Tab\tseparated\tvalues\nMore\tseparated\tvalues";
file_put_contents($file);

Если у вас нет прав на запись в текущий каталог (или любой другой каталог), вы не сможете создать файл, не говоря уже о chmod it.

Если бы вы могли публиковать ошибки, которые вы получаете из своих команд chmod(), это помогло бы.

chmod('.',0777);

должно работать.

0 голосов
/ 03 июня 2009

Вы не можете установить права доступа к записи, если пользователь, запускающий php, не может ее изменить. Посмотрите на конфигурацию apache, найдите пользователя, с которым он работает (по умолчанию это www-data). Чтобы избежать этого в будущем, установите себя в ту же группу, что и группа по умолчанию, и укажите корень документа chmod -R g + a

0 голосов
/ 03 июня 2009

Создайте каталог вне корневого каталога вашего документа, который мы назовем $tmpFolder. Убедитесь, что у пользователя, на котором работает веб-сервер, есть права на чтение / запись. Тогда следующее:

$file_to_send = $tmpFolder . '/ftp_test_from_created_file.txt';
chmod($file_to_send, 0777);
$fh = fopen($file_to_send,'w');
$tsv_line = 'Hey\tThese\tAre\tTab\tSeperated\tValues';
fwrite($fh, $tsv_line);
fwrite($fh, '\n');
$tsv_line = 'Hey\tThese\tAre\tToo';
fwrite($fh, $tsv_line);
fclose($fh);
0 голосов
/ 03 июня 2009

Чтобы изменить разрешение текущего каталога, используйте

chmod('.', PERMISSION);

Вам действительно нужен 0777, т. Е. Мир для чтения и записи? Мне кажется очень слабым!

Редактировать : Ваше предложение chmod ('../osingfolder /', 0777); должен был работать тоже. Можете ли вы быть более подробным об ошибках, которые вы получаете?

...