ответы 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 может изменить это разрешение ссылки (которое внутренне использует системный вызов не-POSIX lchown() для достижения this), и системный вызов stat() возвращает это значение для st_mode .
Символические ссылки в Linux и FreeBSD всегда могут быть использованы, как указано в POSIX. В частности, во FreeBSD это означает, что файловый режим символьной ссылки вообще не влияет на управление доступом.
С другой стороны, macOS слегка ломает POSIX. Хотя по символической ссылке можно следовать независимо от разрешения на чтение, readlink() завершается ошибкой с EACCES (Permission denied), если у пользователя нет разрешения на чтение:
$ 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() и обходом ссылки.