Например, у меня есть foo.sh с разрешениями 770. Когда я это сделаю:
ln -s foo.sh bar.sh
Ссылка bar.sh имеет 2777 разрешений. Почему это? Я думал, что они должны быть унаследованы?
Например, у меня есть foo.sh с разрешениями 770. Когда я это сделаю:
ln -s foo.sh bar.sh
Ссылка bar.sh имеет 2777 разрешений. Почему это? Я думал, что они должны быть унаследованы?
Разрешения на символическую ссылку в значительной степени несущественны. Обычно они 777 изменяются с помощью настройки umask.
Стандарт POSIX для symlink()
говорит:
Значения бит режима файла для созданной символической ссылки не определены. Все интерфейсы, указанные в POSIX.1-2008, должны вести себя так, как будто содержимое символических ссылок всегда можно прочитать, за исключением того, что значение бит режима файла, возвращаемое в поле
st_mode
структуры stat, не указано.
POSIX предоставляет системный вызов lchown()
; он не предоставляет функцию .lchmod()
(На моем MacOS X 10.7.1 с помощью umask 022 вновь созданная символическая ссылка заканчивается 755 правами, а с umask 002 разрешения становятся 775. Таким образом, наблюдение, что ссылки создаются с 770, 700 и т.д. разрешения могут быть точными, а настройки разрешений по-прежнему несущественны и не влияют на удобство использования символической ссылки.)
В Linux (RHEL 5 для x86_64; kernel 2.6.18-128.el5) я могу увидеть только 777 разрешений на символическую ссылку при ее создании:
$ (ls -l xx.pl; umask 777; ln -s xx.pl pqr; ls -l xx.pl pqr)
-rw-r--r-- 1 jleffler rd 319 2011-09-05 22:10 xx.pl
lrwxrwxrwx 1 jleffler rd 5 2011-09-21 10:16 pqr -> xx.pl
-rw-r--r-- 1 jleffler rd 319 2011-09-05 22:10 xx.pl
$
Я запустил это в суб-оболочке, поэтому установка umask не была постоянной.
В MacOS X (10.7.1) я могу увидеть переменные разрешения для символической ссылки:
$ (ls -l xxx.sql; umask 777; ln -s xxx.sql pqr; ls -l xxx.sql pqr)
-rw-r--r-- 1 jleffler staff 1916 Jun 9 17:15 xxx.sql
ls: pqr: Permission denied
l--------- 1 jleffler staff 7 Sep 21 10:18 pqr
-rw-r--r-- 1 jleffler staff 1916 Jun 9 17:15 xxx.sql
$
Обратите внимание, что это одна и та же последовательность команд (указать или взять имя файла), связанное с.
В MacOS X команда chmod
имеет параметр -h
для изменения прав доступа к самой символической ссылке:
-h
Если файл является символической ссылкой, измените режим самой ссылки, а не файл, на который указывает ссылка.
В MacOS X разрешения на тему символической ссылки; вы не можете прочитать символическую ссылку, если у вас нет разрешения на чтение символической ссылки (или вы root). Следовательно, ошибка в выводе ls
выше. И readlink
не удалось. Etc.
В MacOS X, chmod -h 100 pqr
(выполнить), я могу использовать ссылку (cat pqr
works), но не читать ссылку. Напротив, chmod -h 400 pqr
позволяет мне прочитать ссылку и использовать ссылку. И для полноты, chmod -h 200 pqr
позволяет мне использовать ссылку, но не читать ее. Я предполагаю, что без формального тестирования аналогичные правила применяются к группе и другим.
В MacOS X, похоже, что разрешение на чтение или запись на символической ссылке позволяет вам использовать ее в обычном режиме, но только разрешение на выполнение означает, что вы не можете найти, где точки ссылки (readlink(2)
не удается), даже если вы может получить доступ к файлу (или, предположительно, к каталогу) на другом конце ссылки.
Поведение MacOS X - это расширение поведения, заданного POSIX, или отклонение от поведения, установленного POSIX. Это немного усложняет жизнь. Это означает, что вы должны убедиться, что любой, кто должен использовать ссылку, имеет разрешение на это. Это обычно тривиально (umask 022
означает, что это будет так).
Подходящий системный вызов для chown -h
на MacOS X - setattrlist(2)
.
http://en.wikipedia.org/wiki/Symbolic_link
Разрешения файловой системы символической ссылки обычно имеют релевантность только для переименования или удаления операций самой ссылки, а не режимы доступа целевого файла, которые контролируются целевым файлов.
Разрешения для ссылки - это просто. Он указывает, что он все еще имеет собственные разрешения.