Если каталог «foo» принадлежит пользователю A и содержит каталог «bar», который принадлежит пользователю root, пользователь A может просто удалить его с помощью rmdir
, что логично, потому что "foo" доступен для записи пользователю A.
Но если каталог bar содержит другой файл, принадлежащий root, каталог не может быть удален, потому что файлы в нем должны быть сначала удалены, поэтому он становится пустым. Но сам «бар» не доступен для записи, поэтому удалить в нем файлы невозможно.
Есть ли способ обойти это? Или убеди меня иначе, зачем это нужно.
Интерпретация 1: каталог - это подпространство файловой системы. В дальнейшем его можно разделить на подпространства, создав в нем подкаталоги. Владелец каталога foo
должен иметь контроль над всем внутри подпространства: foo/bar
, foo/bar/qux
, и т.д.
Интерпретация 2: каталог - это подпространство файловой системы. Каждый каталог прикреплен к некоторому другому каталогу, который называется его родительским. Владелец каталога foo
имеет контроль над всем внутри подпространства; однако для подкаталога foo/bar
, владелец foo
имеет контроль над тем, bar
может быть прикреплен к foo
но не над тем, что происходит внутри bar
: только владелец bar
контролирует это.
Доказательства в пользу интерпретации 2: как вы отметили, как работают разрешения. Кроме того, тот факт, что некоторые файловые системы Unix позволяют прикреплять каталог более чем к одному родительскому элементу: это называется наличием нескольких жестких ссылок. (Наличие нескольких жестких ссылок является обычным явлением для обычных файлов, но обычно это не рекомендуется или запрещено для каталогов, в основном из-за риска создания циклов, когда каталог является его собственным дедушкой и дедушкой, удаленный N раз, поэтому вы не можете добраться до него из корня каталог, что является очень распространенным ожиданием. Существует также проблема, что делать, если каталог имеет 0 жестких ссылок, но не пуст: поскольку каталог не подключен, вы хотите удалить его, но что вы делаете с его содержимое?)
Доказательства в пользу интерпретации 1: на практике каталоги имеют единственного родителя и, таким образом, образуют древовидную структуру. И вы не можете получить доступ foo/bar/qux
если у вас нет разрешения на выполнение foo
так же как bar
(ну, за исключением того, что есть несколько неясных способов получить доступ к bar
без доступа к foo
). Так что верхние уровни имеют значение.
С практической точки зрения, в вашей ситуации пользователь A может сделать
mkdir garbage mv foo/bar garbage/ rmdir foo
Единственный способ обойти это - использовать либо setgid, либо setuid в родительском каталоге, либо использовать ACL.
Установите setgid каталога с помощью
chmod g+s foo
Установите для него ACL по умолчанию с помощью
setfacl -d -R -m g:group:rwx foo
Это устанавливает его как ACL по умолчанию для этого пути. Вы должны смонтировать файловую систему, которая содержит этот путь, с опцией acl!
А теперь скажи мне, почему ты думаешь, что хочешь этого.