Разрешения файловой системы в Unix
Если у меня есть папка, указанная как не читаемая. Все папки под ним также не читаются? Например, мой каталог домашней учетной записи общего хостинга недоступен для других учетных записей, поэтому все папки и файлы, которые находятся в этом домашнем каталоге 0777, также недоступны?
4 ответа
Каталоги имеют два разных разрешения на чтение. У вас есть стандартное разрешение на чтение, как вы делаете с файлами. Это останавливает вас от выполнения opendir()/readdir() в каталоге. Это в основном мешает вам делать ls в каталоге. Вы все еще можете получить доступ к подкаталогам, если вы знаете их название. У вас также есть разрешение на выполнение, которое в случае каталогов препятствует доступу к файлам внутри них. Вы не можете изменить каталог на каталог, для которого у вас нет разрешения на выполнение, и вы не можете получить к нему доступ, но вы все равно можете прочитать его содержимое.
# mkdir -p read/subdirectory
# mkdir -p execute/subdirectory
# chmod o-x execute/
# chmod o-r read
# logout
% ls -ld read/ execute/
drwxr-xr-- 3 root root 4096 2009-10-20 14:43 execute/
drwxr-x--x 3 root root 4096 2009-10-20 14:43 read/
% ls read
ls: cannot open directory read: Permission denied
% ls execute
ls: cannot access execute/subdirectory: Permission denied
subdirectory
% cd read/subdirectory
% cd -
% cd execute/subdirectory
bash: cd: execute/subdirectory: Permission denied
Вы заметите, что ls execute
отображает ошибку и подкаталог. Причина в том, что ls разрешено читать каталог выполнения и обнаруживать подкаталог, но ls будет определять подкаталог и получать в нем запрещенное разрешение.
Ответ - "Да". Например, если /foo это mode -r-x------
Никто, кроме владельца, не может читать или переходить в /foo, поэтому все, что находится под этим каталогом, недоступно для всех остальных, независимо от разрешений.
Вы можете прочитать каталог, родитель которого не читается:
[kbrandt@kb: ~/scrap/perm] ls -ld foo
d--x------ 4 kbrandt kbrandt 4096 2009-10-20 08:45 foo
[kbrandt@kb: ~/scrap/perm] ls -ld foo/bar
drwxrwxr-x 3 kbrandt kbrandt 4096 2009-10-20 08:55 foo/bar
[kbrandt@kb: ~/scrap/perm] ls foo
ls: cannot open directory foo: Permission denied
[kbrandt@kb: ~/scrap/perm] ls foo/bar
baz foo
Права доступа к каталогам - не то, что вы думаете (из того, что я понял из вашего поста):
Выполнить (Поиск) - Войти в каталог
Запись - создание и удаление файлов в этом каталоге
Читать - список файлов в каталоге
Выполнение (поиск) требует, чтобы все родители имели набор выполнения, в отличие от чтения и записи.
Это пример того, почему важно понимать права доступа к каталогу:
Даже если root владеет файлом, и другие пользователи не имеют права на запись в этот файл, если другие пользователи могут записывать и искать в этом каталоге, этот пользователь может удалить файл (при условии, что это была последняя оставшаяся жесткая ссылка).
Это зависит от реализации, но в большинстве современных юниксов запрет доступа к родительской папке также запрещает доступ к подпапкам, независимо от их индивидуальных разрешений.
user@host:/$ sudo chmod 700 test
user@host:/$ sudo ls -ld test/test
drwxr-xr-x 2 root root 4096 2009-10-20 15:29 test/test
user@host:/$ ls -ld test/test
ls: cannot access test/test: Permission denied
Если вы хотите предоставить доступ к подпапкам, вы можете установить бит выполнения в родительской папке.
user@host:/$ sudo chmod 711 test
user@host:/$ ls -l test
ls: cannot open directory /test: Permission denied
user@host:/$ ls -ld test/test
drwxr-xr-x 2 root root 4096 2009-10-20 15:29 test/test
Как видите, это предотвращает перечисление родительской папки, но позволяет получить доступ к подпапке и файлам.