Символическая ссылка не наследует разрешения
Например, у меня есть foo.sh с разрешениями 770. Когда я делаю:
ln -s foo.sh bar.sh
Ссылка bar.sh имеет 2777 разрешений. Почему это? Я думал, что они должны были быть унаследованы?
2 ответа
Разрешения на символическую ссылку в значительной степени несущественны. Обычно они 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 и т.д., может быть точные, настройки разрешений все еще не имеют значения и не влияют на удобство использования символической ссылки.)
Дальнейшие исследования о символических ссылках на RHEL 5 и MacOS X
В Linux (RHEL 5 для x86_64; ядро 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
не удалось. И т.п.В MacOS X
chmod -h 100 pqr
(выполнить) позволяет мне использовать ссылку (cat pqr
работает) но не читать ссылку. В отличие отchmod -h 400 pqr
позволяет мне читать ссылку и использовать ссылку. И для полнотыchmod -h 200 pqr
позволяет мне использовать ссылку, но не читать ее. Я предполагаю, что, не пройдя формальную проверку, аналогичные правила применяются к группе и другим.Таким образом, в MacOS X разрешение чтения или записи символической ссылки позволяет вам использовать его в обычном режиме, но одно только разрешение на выполнение означает, что вы не можете найти, куда указывает ссылка (
readlink(2)
не удается), даже если вы можете получить доступ к файлу (или, предположительно, к каталогу) на другом конце ссылки.
Заключение (может быть изменено):
- В некоторых версиях Linux вы можете получить разрешение 777 только по символической ссылке.
- В MacOS X вы можете настроить разрешения для символической ссылки, и они влияют на то, кто может использовать символическую ссылку.
Поведение MacOS X является расширением поведения, предписанного POSIX, или отклонением от поведения, предписанного POSIX. Это немного усложняет жизнь. Это означает, что вы должны убедиться, что любой, кто должен использовать ссылку, имеет разрешение на это. Это обычно тривиально (umask 022
значит, так и будет).
Основной системный вызов для chown -h
на MacOS X есть setattrlist(2)
,
http://en.wikipedia.org/wiki/Symbolic_link
Разрешения файловой системы для символической ссылки обычно имеют отношение только к операциям переименования или удаления самой ссылки, а не к режимам доступа целевого файла, которые управляются собственными разрешениями целевого файла.
Разрешения для ссылки только это. То, на что он указывает, все еще имеет свои собственные разрешения.