Змінення дозволів на символічне посилання


37

У мене є символьне посилання з цими дозволами:

lrwxrwxrwx 1 myuser myuser       38 Aug 18 00:36 npm -> ../lib/node_modules/npm/bin/npm-cli.js*

Симпосилання знаходиться в архіві .tar.gz. Тепер, коли я розпаковую архів tar.gz за допомогою maven, посилання більше не діє. Тому я намагаюся відновити симпосилання. Спочатку я створюю симпосилання за допомогою ln, але як мені встановити ті ж дозволи, що й вихідні символьні посилання?

Відповіді:


59

Можна створити нове символьне посилання та перемістити його до місця старого посилання.

ln -s <new_location> npm2
mv -f npm2 npm

Це збереже право власності на посилання. Можна chownтакож встановити право власності на посилання вручну.

chown -h myuser:myuser npm

У більшості систем дозволи на символьні посилання не мають значення. Під час використання символьної посилання перевірятиметься права доступу компонентів цілі символьного посилання. Однак у деяких системах вони мають значення. MacOS вимагає дозволу читання на посиланні для readlink, а sympermопція монтажу NetBSD змушує перевіряти посилання на права читання та обходу. У цих системах (та їх родичах, включаючи FreeBSD та OpenBSD) є еквівалентний -hваріант chmod.

chmod -h 777 npm

1
Щойно я зіткнувся з проблемою дозволу із посиланнями на сервер CentOS 6.8. Символьні посилання мали власника: група кореня: корінь. Коли власник та група були змінені на користувача, який володів каталогом, у якому вони перебувають, як показано в цій відповіді, проблема з дозволом усунулася.
Сова

Просто надання пояснення. Щоб змінити право власності або права на symlink, прапор -h вплине на файл symlink замість dereferenced-файла.
UltimaWeapon

12

Коли ви намагаєтеся chmodвстановити дозволи дозволу, фактично ви робите це встановлення дозволів для цілі посилання. Дозволи дозволу на нього є безглуздими.


2
Що робити, якщо хтось змінить посилання на шкідливий код? Оригінальний код навіть може бути чимось, до якого може отримати тільки root. Наприклад, у сценаріях crontap.
aliqandil

@aliqandil Зазвичай користувач може видалити та відтворити будь-який файл у каталозі, до якого має доступ для запису. В основному, для файлу testз -rw-rw-r-- root root, тому що rm testя отримую підказку rm: remove write-protected regular empty file 'test'?Рішення полягає в розміщенні чутливих файлів у каталогах, до яких користувачі мають доступ лише для читання.
AnOccasionalCashew

5

Коли у вас є посилання типу:

link -> foo/bar

і хочете змінити його на:

link -> new/target

Слід розглянути два випадки:

  1. foo/barне є каталогом або не існує, або ви не маєте доступу до пошуку foo. Потім

    ln -s new/target link
    

    не вдасться, тому що linkвже існує, але ви можете подолати це, використовуючи стандарт:

    ln -fs new/target link
    
  2. foo/barце каталог (і у вас є дозвіл на пошук, fooщоб мати можливість визначити, що foo/barце каталог). У тому випадку, коли ви робите:

    ln -s new/target link
    

    або

    ln -fs new/target link
    

    Це розуміється як створення нового targetсимвольного посилання всередині linkкаталогу ( linkце каталог, оскільки це символьне посилання на foo/barкаталог). Таким чином, ви фактично створите:

    foo/bar/target -> new/target
    

    Щоб подолати це, GNU lnмає -Tможливість ім'я посилання завжди розглядати як ім'я посилання, а не як каталог для створення посилань (и). Так, з GNU ln:

    ln -fsT new/target link
    

    буду працювати. Як і раніше, він видалить початкове linkсимвольне посилання та створить його заново new/targetяк ціль (і процес 'euid та egid як власник).

    У GNU lnтакож є -nваріант. Це працює як -Tвиняток, коли linkнасправді це справжній каталог, і в цьому випадку він все одно створить симпосилання всередині цього каталогу (замість того, щоб не виходити з помилкою).

    Портативно, найкращий варіант - спочатку видалити посилання, а потім відтворити його:

    rm -f link && ln -s new/target link
    

У більшості систем дозволи на символьні посилання ігноруються і, як правило, фіксуються на rwxrwxrwx.

У системах, де значення дозволів для символьних посилань мають значення (наприклад, для OS / X, де вам потрібно дозволити читання, щоб мати змогу вирішити свою ціль), зазвичай існує спосіб їх зміни ( chmod -hдля OS / X).

Власність, хоча, як і вище, не стосується доступу до файлу, на який вказує символьна посилання в більшості систем, може мати інше значення, wrt tбіт батьківського каталогу або квоти ... ) і є стандартна команда для його зміни:

chown -h user[:group] the-link
chgrp -h group the-link

0

Якщо вам дійсно потрібно змінити дозвіл символьних посилань (як правило, безглуздо, як це написано в інших відповідях), я досяг успіху з використанням -Rопції chown:

chown -R myuser:mygroup link

Якщо -Rйого не використовували, дозволи не були змінені.


Це буде працювати з GNU, chownоскільки -Rмається на увазі -Pтам, однак це не гарантується і не буде працювати в інших реалізаціях програми chown. Стандартний спосіб змінити право власності на симпосилання - за допомогою -hпараметра. Я щойно оновив прийняту відповідь, яка була неправильною.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.