У меня есть папка с -wx
разрешениями, folder1
и другая папка внутри называется folder2
с rwx
разрешениями.
Я попытался удалить folder1
с помощью этой команды:
rm -r folder1
Но я получил следующую ошибку:
rm: cannot remove 'folder1': Permission denied
Причина, по которой я думаю, что я получил эту ошибку, заключается в том, что rm
программе необходимо сначала получить содержимое folder1
(получить имена файлов и папок внутри folder1
него), чтобы иметь возможность удалить этот контент (потому что вы не можете удалить файл или папку, не зная ее названия, я думаю), а затем rm
программа может удалить folder1
себя.
Но поскольку у folder1
него нет read
разрешения, rm
программа не может получить его содержимое, и, следовательно, она не может удалить его содержимое, и, поскольку оно не может удалить его содержимое, то оно не может удалить его.
Я прав?
источник
Ответы:
Я думаю, что ваш анализ правильный: вы не можете удалить каталог, так как он не пустой, и вы не можете очистить его, так как вы не можете видеть его содержимое.
Я только что попробовал:
Когда я писал «ты», я имел в виду любую программу, которую ты можешь запустить.
rm -r
Сначала ваша команда видит, чтоfolder1
это каталог, поэтому она пытается обнаружить его содержимое, чтобы очистить его, но ей не удается пропустить разрешение на чтение, затем она пытается удалить его, но не удается, потому что он не пуст. «Отказано в доступе» вводит в заблуждение; Я думаю, что «Каталог не пустой» (например,rmdir
отчеты) будет более уместным.)источник
Directory not empty
в этом случае, так как он не знал бы, пусто это или нет. Вы все равно получите ту же ошибку при попытке удалить пустой каталог, для которого у вас нет прав на чтение. (Также, пожалуйста, не обращайте внимания на мой предыдущий комментарий, у меня не было мышления).rmdir
может сообщить «Каталог не пуст». И если вы прочтете мой тест, вы увидите, что он разрешает удалитьfolder1
каталог без разрешения на чтение , как только я его опустошу.Permission denied
при попытке,rm -r folder1
когда он пуст. Я на OpenBSD, а не на Linux.-r
используется, каждая запись каталога (кроме.
и..
) должна быть удалена, как если бы они были файловым операндомrm -r
. Похоже, что GNUrm
просто делаетrmdir()
в каталоге, если он не читается, потому что он не сможет получить его содержимое.Для того чтобы удаление произошло, система должна иметь возможность прочитать содержимое и определить, что должно быть удалено.
Я попытался смоделировать то, что вы пытаетесь:
Если мы попытаемся удалить без разрешения на чтение, это не удастся:
В двух разных попытках различие заключается в том, что содержимое каталога не может быть прочитано (getdents):
С разрешениями на чтение:
В заключение, даже если у вас есть каталог, в котором есть исполняемый бит, вам все равно нужны разрешения на чтение, чтобы вы могли видеть его содержимое и удалять папку. Это не то же самое для файла, хотя.
источник
Ну, у меня недостаточно репутации, чтобы комментировать ответ от ttaran7, так что, похоже, ответ будет. Мой положительный голос также не виден публично из-за низкой репутации. Я проголосовал за этот ответ за фактическое включение трассировки системных вызовов, а не просто предположение.
Чтобы ответить на вопрос ОП: Да, ваши рассуждения были правильными: вы заблокированы при невозможности прочитать каталог
Я выполнил ту же трассировку, что и они (ttaran7), потому что подозревал ту же причину: при сбое
rm
чтения каталога произойдет сбой вызова, и на этом все закончится, и нет никаких шансов жаловаться на то, что каталог пуст. После второго взгляда на трассу, которую я выбрал, я заметил, что был сделан системный вызов, чтобы попытаться отменить предоставленное имя файла в любом случае:Посмотрите на 4-ую строку:
unlinkat
... которая не выполняется, потому что каталог НЕ пуст. Теперь это то, что я считаю неожиданным поведением, тот факт, что он вообще пытается удалить каталог, несмотря на то, что у него нет разрешений на чтение.источник