Як дозволи на використання файлів застосовуються до посилань?


93

Скажімо, у вас така структура:

+ directory
-- file1
-- file2
-- file3 -> /tmp/file3

file3є посиланням на інше file3десь в системі.

Тепер скажімо, що я chmod 777каталог і весь вміст всередині нього. Чи має мій file3в /tmpотримувати ці дозволи? Скажімо, у нас така ж ситуація, але зворотна.

/tmp/file3 -> /directory/file3

Якщо я застосую дозволи на файл, до якого пов’язаний, як це впливає на посилання?


Дозволи мають впливати лише на файл, а не на посилання.
baraboom

Відповіді:


90

Це залежить від того, як ви телефонуєте chmodта платформи, на якій ви працюєте.

Наприклад, в системі Linux man chmodце говорить:

chmod ніколи не змінює дозволи символічних посилань; chmod системний виклик не може змінювати їх дозволу. Це не є проблемою, оскільки дозволи символічних посилань ніколи не використовуються. Однак для кожного символьного посилання, вказаного в командному рядку, chmodзмінюються дозволи файлу, що вказується. На відміну від цього, chmodігнорується символічні посилання, що виникають під час рекурсивного обходу каталогів.

Однак на Mac, chmod можна використовувати для зміни дозволів символічного посилання, використовуючи такі параметри, як цей (від man chmod):

-h Якщо файл є символьним посиланням, змініть режим самого посилання, а не файл, на який вказує посилання.

Для прикладу, давайте припустимо, що ви знаходитесь на машині Linux для решти цієї відповіді.

Якщо в першому випадку ви запустите chmod -R 777 directoryрекурсивно змінювати дозволи, ціль посилання не вплине, але якщо ви це зробите chmod 777 directory/*, це буде.

Якщо ви зміните дозволи на ціль посилання безпосередньо, ці дозволи будуть виконуватись (оскільки, як кажуть man-сторінка та baraboom , фактичні дозволи на посилання не використовуються ні для чого).


Журнал випробувань для ілюстрації:

$ mkdir dir && touch dir/file{1,2} /tmp/file3 && ln -s {/tmp,dir}/file3
$ ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 dir/file1
-rw-r--r-- 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

$ chmod -R 777 dir && ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 /tmp/file3
-rwxrwxrwx 1 user group  0 2011-06-27 22:02 dir/file1
-rwxrwxrwx 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

$ chmod 700 dir/* && ls -l dir/* /tmp/file3
-rwx------ 1 user group  0 2011-06-27 22:02 /tmp/file3
-rwx------ 1 user group  0 2011-06-27 22:02 dir/file1
-rwx------ 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

2
Це було і для мене сюрпризом. Наступне питання: хто дозвіл на лінк означає ?
Едвард Фолк

Дозволи на символьне посилання @EdwardFalk не є обмежуючими, оскільки все має бути спроможним пройти, щоб отримати дозволи з пов'язаного файлу.
Вальф

5

Відповіді baraboom та peth є правильними: біти дозволу на самі символічні посилання не мають значення (крім macOS; див. нижче), а зміна дозволу на символічне посилання - інструментом chmodкомандного рядка або chmod()системним викликом - буде просто діяти як якщо воно було виконане проти цілі символічного зв’язку.

Щоб процитувати SUSv4 / POSIX.1-2008 опис системного виклику symlink () :

Значення бітів режиму файлу для створеного символічного посилання не визначено. Всі інтерфейси , зазначені POSIX.1-2008 повинні вести себе так , як ніби вміст символічних посилань завжди можна прочитати, за винятком того, що значення бітів режиму файлу , що повертається в st_mode поле стат структури не визначено.

Тут «невизначений» залишає місце для інтерпретації для кожної реалізації. Особливості:

  • У Linux (тестовано за допомогою ext4fs) stat()повертається st_mode=0777, незалежно від того, яким був umask при створенні симпосилання; ls -lтому завжди відображається lrwxrwxrwxдля символічних посилань.
  • У macOS (HFS) і FreeBSD (як UFS, так і в ZFS) символічне посилання має власний дозвіл: chmod -hКоманда, зазначена вище, може змінити дозвіл цього посилання (що внутрішньо використовує не-POSIX- lchown()системний виклик для досягнення цього) та stat()систему call повертає це значення для st_mode.

Символічні посилання на Linux та FreeBSD завжди можна дотримуватися, як зазначено в POSIX. Зокрема, на FreeBSD це означає, що режим файлу символічного посилання взагалі не впливає на контроль доступу.

З іншого боку, macOS трохи ламає POSIX. Незважаючи на те, що символічне посилання може бути дотримано незалежно від його дозволу на читання, readlink()не працює з дозволом, EACCESякщо користувач не має дозволу на читання

$ 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()посилань для управління та переходу посилання.


-1
  1. опустити файл посилання (після того, як переконаєтесь, що він не використовується жодним процесом)
  2. встановіть umask таким чином, щоб 777-umask = необхідні дозволи файлу
  3. створити файл посилання заново

3
Як це відповідає на питання?
jww
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.