ответы 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()
и обходом ссылки.