Intereting Posts
Присоедините два текстовых файла к порядку ведения 1-го столбца и неустранимые строки из 1-го файла Почему ls -l показывает время и год для каждого файла? Монитор MPSSH Прогресс, возможно, PV? Какой системный файл загружает модуль ядра wli (wifi) во время загрузки? Выбор текста в rxvt-unicode и tmux с отключением мыши Ошибка обновления Yum – Требуется: python26-ordereddict bash: export: `–wait ': недействительный идентификатор rsync – включить файл верхнего уровня и исключить каталоги Как первичное ядро ​​unix обратилось к памяти? Bash – ввод данных для замещенной команды, хранящейся в переменной Автоматическое обнаружение новых файлов и их загрузка Удалите пробелы и круглые скобки в именах файлов с помощью sed Будет ли остановлен процесс tmux в терминале ssh, когда я остановлю свой ноутбук? Внешний загрузочный загрузчик EFI с Debian 7.7 Wheezy Установка umask для su root

Почему существуют права на запись и выполнение в каталоге, который необходим для удаления файлов?

Легко понять, что права доступа к файлу не имеют отношения к возможности удаления этого файла. Возможность изменять список каталогов контролируется разрешениями каталога.

Однако в течение многих лет я считал, что целью разрешения на запись было разрешение на изменение каталога, а разрешение на выполнение – на поиск, переименование файлов или изменение в каталог.

Сегодня я обнаружил, что нельзя хранить файл в каталоге, если не установлены оба бита записи и выполнения. На самом деле, без выполнения набора, запись кажется почти бесполезной.

 $ tree foo/ foo/ └── file_to_delete 0 directories, 1 file $ chmod -x foo $ ls -ld foo drw-rw-r-- 2 ire_and_curses users 4096 Sep 18 22:08 foo/ $ rm foo/file_to_delete rm: cannot remove 'foo/file_to_delete': Permission denied $ chmod +x foo/ $ rm foo/file_to_delete $ tree foo/ foo/ 0 directories, 0 files $ 

Я нахожу это поведение довольно неожиданным. Для каталогов, какова причина того, что выполнение необходимо для того, чтобы написать полезную на практике?

Без бита выполнения вы не можете запустить stat() в файлах в каталоге, что означает, что вы не можете определить информацию об инодах этих файлов. Чтобы удалить файл, вы должны знать информацию, которая будет возвращена stat() .

Демонстрация этого:

 $ ls -ld test drw------- 2 alienth alienth 4096 Sep 18 23:45 test $ stat test/file stat: cannot stat 'test/file': Permission denied $ strace -e newfstatat rm test/file newfstatat(AT_FDCWD, "test/file", 0x1a3f368, AT_SYMLINK_NOFOLLOW) = -1 EACCES (Permission denied) newfstatat(AT_FDCWD, "test/file", 0x7fff13d4f4f0, AT_SYMLINK_NOFOLLOW) = -1 EACCES (Permission denied) rm: cannot remove 'test/file': Permission denied +++ exited with 1 +++ 

Вы также можете продемонстрировать это с помощью простого ls -l . Информация метаданных каталога может быть доступна для чтения и записи для пользователя, но без выполнения вы не можете определить детали файла в каталоге.

 $ ls -l test ls: cannot access test/file: Permission denied total 0 -????????? ? ? ? ? ? file