Эта интерпретация разрешений восходит к ранним файловым системам Unix. В начале были только файлы. (Ну, и устройства, и каналы, и ... но я пытаюсь рассказать историю здесь, а не быть на 100% строго точным; кроме того, все это верно для устройств и каналов и всего остального, потому что все является файлом, даже каталоги).
Каталоги - это просто файлы, которые файловая система использует для хранения метаданных, описывающих дерево каталогов, и файлов, которые в нем содержатся. Каждый файл в каталоге был описан простой структурой данных, которая содержала место для имени файла (первоначально 14 символов, IIRC) вместе с номером инода, где хранились данные, размером файла, временными метками и словом прав доступа. , Каждый каталог начинался с двух записей с именем .
и ..
, первый указывал на индекс этого самого каталога, а второй - на индекс его родительского каталога.
Слово разрешений содержало девять битов для описания обращения с владельцем, другими членами той же группы и миром. Три бита для каждого флага указывают, может ли соответствующий пользователь прочитать, записать или выполнить файл. (Вы можете заметить, что в 16-разрядном слове разрешений есть еще пять битов, которые я игнорирую. В конечном итоге они получили назначенные значения, но это не относится к этой части истории.) (Кроме того, это толкование девяти биты остались почти одинаковыми у всех потомков ранних версий Unix, включая Linux.)
Таким образом, если каталог действительно является особым видом файла и описывается записью в каком-либо каталоге, он, очевидно, также имеет биты прав доступа, и эти биты, вероятно, что-то значат. Но вопрос в том, что именно. Самый простой способ присвоить значение этим битам - не изменять то, что они означают. И это по сути то, что было сделано.
Таким образом, бит чтения означает, что пользователь может читать сам каталог. Это классически дает читателю доступ к имени файла, меткам времени, размеру и номеру узла для каждого файла. В частности, с помощью r
set вы можете использовать, ls
чтобы увидеть имена всех файлов в каталоге, но этого недостаточно для открытия (или использования каким-либо образом) любого из перечисленных файлов.
Бит выполнения означает, что пользователь может «выполнить» каталог. Поскольку каталоги особенные, выполнить действительно означает найти запись по имени и использовать ее. Это означает, что вы можете попытаться открыть файлы, если они x
установлены, но без них r
вы не сможете обнаружить их имена. Разумеется, права доступа к запрашиваемому файлу также влияют на доступ, поэтому даже при x
наличии в каталоге вы не сможете прочитать файл, если он также не предложит вам r
.
Бит записи означает, что пользователь может записывать в каталог, но, естественно, только с помощью самой файловой системы. Это означает, что с помощью w
set вы можете создавать новые файлы в этом каталоге или редактировать записи каталога существующих файлов. Но без x
набора вы не можете использовать какие-либо файлы, и без них r
вы тоже их не увидите.
По мере того как в Unix и его потомках развивались более сложные модели идентификации пользователей, эти же базовые описания смогли остаться на удивление неизменными.
Короче говоря, r
означает, что вы можете видеть его содержимое, x
означает, что вы можете использовать его, и w
означает, что вы можете изменить его даже для каталогов.