Символическая ссылка не наследует разрешения - PullRequest
16 голосов
/ 20 сентября 2011

Например, у меня есть foo.sh с разрешениями 770.Когда я это сделаю:

ln -s foo.sh bar.sh

Ссылка bar.sh имеет 2777 разрешений.Почему это?Я думал, что они должны были быть унаследованы?

Ответы [ 2 ]

25 голосов
/ 20 сентября 2011

Разрешения на символическую ссылку в значительной степени несущественны. Обычно это 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

  1. В 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 не была постоянной.

  2. В 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
    $
    

    Обратите внимание, что это та же последовательность команд (дать или взять имя файла), связанная с.

  3. В MacOS X команда chmod имеет параметр -h для изменения разрешений самой символической ссылки:

    -h Если файл является символической ссылкой, измените режим самой ссылки, а не файла, на который указывает ссылка.

  4. В MacOS X разрешения для символической ссылки имеют значение; вы не можете читать символическую ссылку, если у вас нет разрешения на чтение символической ссылки (или вы являетесь пользователем root). Отсюда и ошибка в выводе ls выше. И readlink не удалось. Etc.

  5. В MacOS X chmod -h 100 pqr (выполнить) позволяет мне использовать ссылку (cat pqr работает), но не читать ссылку. В отличие от этого, chmod -h 400 pqr позволяет мне читать ссылку и использовать ее. И для полноты chmod -h 200 pqr позволяет мне использовать ссылку, но не читать ее. Я предполагаю, что, не пройдя формального тестирования, аналогичные правила применяются к группе и другим.

  6. Таким образом, в MacOS X кажется, что разрешение на чтение или запись символической ссылки позволяет вам использовать его обычным образом, но одно только разрешение на выполнение означает, что вы не можете найти точку ссылки (readlink(2) не удается), даже если вы может получить доступ к файлу (или, предположительно, к каталогу) на другом конце ссылки.

Заключение (может быть изменено):

  1. В некоторых версиях Linux вы можете получить разрешение 777 только для символической ссылки.
  2. В MacOS X вы можете настроить разрешения для символической ссылки, и они влияют на то, кто может использовать символическую ссылку.

Поведение MacOS X является расширением поведения, предписанного POSIX - или отклонением от поведения, предписанного POSIX. Это немного усложняет жизнь. Это означает, что вы должны убедиться, что у любого, кто должен использовать ссылку, есть разрешение на это. Обычно это тривиально (umask 022 означает, что так и будет).

Базовый системный вызов для chown -h в MacOS X: setattrlist(2).

4 голосов
/ 20 сентября 2011

http://en.wikipedia.org/wiki/Symbolic_link

Разрешения файловой системы для символической ссылки обычно имеют отношение только для переименования или удаления самой ссылки, а не для режимы доступа целевого файла, которые контролируются целевым собственные разрешения файла.

Разрешения для ссылки - только это. То, на что он указывает, все еще имеет свои собственные разрешения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...