Ответы baraboom и peth верны: биты прав доступа на самих символьных ссылках не имеют значения (кроме macOS; см. ниже), а изменение разрешения на символьную ссылку - с помощью chmod
инструмента командной строки или chmod()
системного вызова - будет просто действовать как если это было выполнено против цели символической ссылки.
Чтобы процитировать SUSv4 / POSIX.1-2008 описание системного вызова symlink () :
Значения битов режима файла для созданной символической ссылки не определены. Все интерфейсы, указанные в POSIX.1-2008, должны вести себя так, как будто содержимое символических ссылок всегда может быть прочитано, за исключением того, что значение битов режима файла, возвращаемых в поле st_mode структуры stat, не указано.
Здесь «неопределенное» оставляет место интерпретации для каждой реализации. Особенности:
- В Linux (протестировано с использованием ext4fs)
stat()
возвращает значение st_mode=0777
независимо от того, каким был umask при создании символической ссылки; ls -l
поэтому всегда отображается lrwxrwxrwx
для символических ссылок.
- В macOS (HFS) и FreeBSD (как UFS, так и ZFS) символическая ссылка имеет свое собственное разрешение:
chmod -h
указанная выше команда может изменить разрешение этой ссылки (которая для этого использует lchown()
системный вызов не-POSIX ), а также stat()
систему call возвращает это значение для st_mode
.
Символические ссылки в Linux и FreeBSD всегда могут быть использованы, как указано в POSIX. В частности, во FreeBSD это означает, что файловый режим символьной ссылки вообще не влияет на управление доступом.
С другой стороны, macOS слегка ломает POSIX. Хотя по символической ссылке можно следовать независимо от разрешения на чтение, происходит readlink()
сбой с EACCES
(Отказано в доступе), если у пользователя нет разрешения на чтение:
$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r-- 1 root staff 1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink
ls: symlink: Permission denied
l--------- 1 root staff 1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye
(Обратите внимание, что эта -> target
часть отсутствует в выходных данных второй ls -l
команды, и она cat symlink
все же прошла успешно и напечатала содержимое target
файла, даже если у пользователя не было разрешения на чтение symlink
.)
NetBSD, по-видимому, предлагает специальную опцию монтирования, symperm
которая, если она установлена, вызывает символические разрешения на чтение / выполнение readlink()
ссылки для контроля и обхода ссылки.