Допустим, у вас есть эта структура:
+ directory
-- file1
-- file2
-- file3 -> /tmp/file3
file3
это ссылка на другое file3
место в системе.
Теперь допустим, что я chmod 777
каталог и все содержимое внутри него. Имеет ли мой file3
в /tmp
получать эти разрешения? Также, скажем, у нас такая же ситуация, но обратная.
/tmp/file3 -> /directory/file3
Если я применяю разрешения к файлу, на который идет ссылка, как это повлияет на ссылку?
Ответы:
Это зависит от того, как вы звоните
chmod
и на какой платформе вы работаете.Например, в системе Linux
man chmod
это говорит:Однако на Mac chmod может использоваться для изменения разрешений символической ссылки, используя такие параметры, как этот (from
man chmod
):Для примера, давайте предположим, что вы находитесь на машине с Linux до конца этого ответа.
Если в первом случае вы запустите
chmod -R 777 directory
рекурсивное изменение разрешений, это не повлияет на цель ссылки, но если вы это сделаетеchmod 777 directory/*
, то это произойдет.Если вы измените разрешения для цели ссылки напрямую, эти разрешения будут выполняться (поскольку, как говорят man-страница и baraboom , фактические разрешения ссылки ни для чего не используются).
Журнал испытаний для иллюстрации:
источник
Ответы baraboom и peth верны: биты прав доступа на самих символьных ссылках не имеют значения (кроме macOS; см. ниже), а изменение разрешения на символьную ссылку - с помощью
chmod
инструмента командной строки илиchmod()
системного вызова - будет просто действовать как если это было выполнено против цели символической ссылки.Чтобы процитировать SUSv4 / POSIX.1-2008 описание системного вызова symlink () :
Здесь «неопределенное» оставляет место интерпретации для каждой реализации. Особенности:
stat()
возвращает значениеst_mode=0777
независимо от того, каким был umask при создании символической ссылки;ls -l
поэтому всегда отображаетсяlrwxrwxrwx
для символических ссылок.chmod -h
указанная выше команда может изменить разрешение этой ссылки (которая для этого используетlchown()
системный вызов не-POSIX ), а такжеstat()
систему call возвращает это значение дляst_mode
.Символические ссылки в Linux и FreeBSD всегда могут быть использованы, как указано в POSIX. В частности, во FreeBSD это означает, что файловый режим символьной ссылки вообще не влияет на управление доступом.
С другой стороны, macOS слегка ломает POSIX. Хотя по символической ссылке можно следовать независимо от разрешения на чтение, происходит
readlink()
сбой сEACCES
(Отказано в доступе), если у пользователя нет разрешения на чтение:(Обратите внимание, что эта
-> target
часть отсутствует в выходных данных второйls -l
команды, и онаcat symlink
все же прошла успешно и напечатала содержимоеtarget
файла, даже если у пользователя не было разрешения на чтениеsymlink
.)NetBSD, по-видимому, предлагает специальную опцию монтирования,
symperm
которая, если она установлена, вызывает символические разрешения на чтение / выполнениеreadlink()
ссылки для контроля и обхода ссылки.источник
источник