Ответы 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()ссылки для контроля и обхода ссылки.