rmdir () ошибка с определенным именем файла?Доступ запрещен - PullRequest
1 голос
/ 25 января 2011

Во-первых, давайте разберемся с этим:

  • В каталоге нет открытых дескрипторов.
  • В каталоге нет файлов.
  • chmod разрешение разрешений для 0777 не предотвращает ошибку.
  • имя каталога правильное.

Теперь вот моя проблема.rmdir() выдает эту ошибку при попытке удалить каталог:

rmdir (098f6bcd4621d373cade4e832627b4f6) [function.rmdir]: в пути \ to \ administratorrate.php в строке 124

* отказано в разрешении1019 *

098f6bcd4621d373cade4e832627b4f6 - это имя каталога.

Вот соответствующая часть скрипта.

if(is_dir($userhash)) :
foreach (new DirectoryIterator($userhash) as $fileInfo) {
    $fileName = $fileInfo->getFilename();
    if($fileInfo->isDot()) continue;

    if(!rename($userhash.'/'.$fileName , 'trashcan/'.$username.'/'.$fileName)) {
        echo '<p class="error">Could not move '.$fileName.'</p>';
        $err = 1;
    }
}
else :
    echo '<p class="error">Unable to delete files! error: 67</p>';
    $err = 1;
endif;

    //JUST TO BE SURE
    chmod('./',0777);
    chmod($userhash,0777);

// RMDIR ONCE THE DIR IS EMPTY.
if(rmdir($userhash))
    echo '<p class="success">Deleted the user directory. The files are in the trash.</p>';
else {
    echo '<p class="error">Could not remove the user directory. Error: 656</p>';
    $err = 1;
}

Обновление

Я вручную создал каталог 'jake' в том же каталоге.Я сделал rmdir('jake');, и он отлично работал.Теперь я вручную создал dir '098f6bcd4621d373cade4e832627b4f6' в том же каталоге.Я сделал rmdir('098f6bcd4621d373cade4e832627b4f6');, и он допустил ошибку!

Обновление 2

Это начинает выглядеть как странная ошибка rmdir(), столь же маловероятная, как кажется.Вот имена каталогов, которые я создал, а затем попытался удалить с помощью rmdir;

098f6bcd4621d373cade4e832627b4f6        |  didn't work (quintuple checked)
098f6bcd4621d373cade4e832627b4f7        |  worked
098f6bcd4621d373cade4e832627b4f         |  worked
098f6bcd4621d373cade4e832627b4f66       |  worked

1 Ответ

2 голосов
/ 25 января 2011

Чтобы иметь возможность удалить файл:

  • пользователь должен иметь права на запись в каталог PARENT
  • НЕОБХОДИМО установить флаг ограниченного удаления для каталога PARENT

UPDATE: Об ограниченном флаге удаления - с man chmod:

ОГРАНИЧЕННЫЙ ФЛАГ УДАЛЕНИЯ ИЛИ КЛЕЙКА

Ограниченный флаг удаления или прикрепленный бит это один бит, чей интерпретация зависит от файла тип. Для каталогов это мешает непривилегированные пользователи от удаления или переименование файла в каталоге если они не владеют файлом или каталог; это называется ограниченный флаг удаления для каталог, и обычно находится на всемирно доступные для записи каталоги, такие как / tmp. Для обычных файлов на некоторых старых системы, бит сохраняет программу текстовое изображение на устройстве подкачки, так что будет загружаться быстрее при запуске; этот называется липким битом.

Вы можете установить его, добавив 1 к первой восьмеричной цифре в режиме, например:

chmod 1xxx dirname

ОБНОВЛЕНИЕ 2:

Имеет ли пользователь, под которым выполняется php, права доступа к родительскому каталогу chmod?

Другими словами, вы уверены, что первый вызов chmod возвращает true?

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