Zmień uprawnienia do dowiązania symbolicznego


37

Mam dowiązanie symboliczne z tymi uprawnieniami:

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

Dowiązanie symboliczne znajduje się w archiwum .tar.gz. Teraz, gdy rozpakowuję archiwum tar.gz za pomocą maven, dowiązanie symboliczne nie jest już prawidłowe. Dlatego próbuję zrekonstruować dowiązanie symboliczne. Najpierw tworzę dowiązanie symboliczne za pomocą ln, ale jak ustawić te same uprawnienia, co oryginalne dowiązanie symboliczne?

Odpowiedzi:


59

Możesz utworzyć nowe dowiązanie symboliczne i przenieść je do lokalizacji starego linku.

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

Pozwoli to zachować własność łącza. Możesz także użyć chowndo ręcznego ustawienia własności łącza.

chown -h myuser:myuser npm

W większości systemów uprawnienia do dowiązań symbolicznych nie mają znaczenia. Podczas korzystania z dowiązania symbolicznego sprawdzane będą uprawnienia komponentów obiektu docelowego dowiązania symbolicznego. Jednak w niektórych systemach mają one znaczenie. MacOS wymaga uprawnień do odczytu linku readlink, a sympermopcja montowania NetBSD wymusza sprawdzenie uprawnień do linku podczas odczytu i przejścia. W tych systemach (i ich krewnych, w tym FreeBSD i OpenBSD) istnieje odpowiednik -hopcji chmod.

chmod -h 777 npm

1
Właśnie natrafiłem na problem z uprawnieniami z dowiązaniami symbolicznymi na serwerze CentOS 6.8. Dowiązania symboliczne miały właściciela: grupę root: root. Gdy właściciel i grupa zostali zmienieni na użytkownika, który był właścicielem katalogu, w którym się znajdowali, jak pokazano w tej odpowiedzi, problem uprawnień zniknął.
Night Owl

Tylko wyjaśnienie. Aby zmienić własność lub prawa do dowiązania symbolicznego, flaga -h wpłynie na plik dowiązania symbolicznego zamiast pliku dereferencyjnego.
UltimaWeapon

12

Kiedy próbujesz użyć, chmodaby ustawić uprawnienia do łącza, faktycznie robisz to, aby ustawić uprawnienia do celu łącza. Uprawnienia do łącza są bez znaczenia.


2
Co się stanie, jeśli ktoś zmieni link do złośliwego kodu? Oryginalny kod może nawet być czymś, do czego root może uzyskać dostęp. Na przykład w skryptach crontap.
aliqandil

@aliqandil Zasadniczo użytkownik może usunąć i ponownie utworzyć dowolny plik w katalogu, do którego ma dostęp do zapisu. W bashu, dla pliku testz -rw-rw-r-- root root, bo pojawia się rm testmonit rm: remove write-protected regular empty file 'test'?. Rozwiązaniem jest umieszczanie poufnych plików w katalogach, do których użytkownicy mają dostęp tylko do odczytu.
AnOccasionalCashew

5

Gdy masz link taki jak:

link -> foo/bar

i chcesz to zmienić na:

link -> new/target

Należy rozważyć dwa przypadki:

  1. foo/barnie jest katalogiem lub nie istnieje lub nie masz dostępu do wyszukiwania foo. Następnie

    ln -s new/target link
    

    zawiedzie, ponieważ linkjuż istnieje, ale można to obejść, stosując standard:

    ln -fs new/target link
    
  2. foo/barto katalog (i masz uprawnienia do wyszukiwania, fooaby móc ustalić, że foo/barjest to katalog). W takim przypadku, gdy:

    ln -s new/target link
    

    lub

    ln -fs new/target link
    

    Jest to rozumiane jako tworzenie nowego targetdowiązania symbolicznego w linkkatalogu ( linkjest katalogiem, ponieważ jest dowiązaniem symbolicznym do foo/barkatalogu). Więc faktycznie stworzysz:

    foo/bar/target -> new/target
    

    Aby temu zaradzić, GNU lnma -Topcję, aby nazwa linku była zawsze traktowana jako nazwa linku, a nie jako katalog do tworzenia linków. W GNU ln:

    ln -fsT new/target link
    

    będzie działać. Tak jak poprzednio, usunie oryginalne linkdowiązanie symboliczne i utworzy je od nowa new/targetjako cel (oraz euid procesu i egid jako właściciel).

    GNU lnma również -nopcję. Działa tak, jak -Tz wyjątkiem sytuacji, gdy w linkrzeczywistości jest to prawdziwy katalog, w którym to przypadku nadal utworzy dowiązanie symboliczne w tym katalogu (zamiast zawieść z błędem).

    Najlepszym rozwiązaniem jest usunięcie linku, a następnie jego ponowne utworzenie:

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

W większości systemów uprawnienia do dowiązań symbolicznych są ignorowane i zasadniczo ustalone na rwxrwxrwx.

W systemach, w których uprawnienia do dowiązania symbolicznego mają znaczenie (np. OS / X, gdzie potrzebujesz uprawnienia do odczytu dowiązania symbolicznego, aby móc rozwiązać jego cel), ogólnie istnieje sposób, aby je zmienić ( chmod -hw OS / X).

Własność, chociaż jak wyżej, nie ma znaczenia dla dostępu do pliku wskazywanego przez dowiązanie symboliczne w większości systemów, może mieć inne znaczenie dla tczęści katalogu nadrzędnego lub przydziałów ... ) i istnieje standardowe polecenie, aby to zmienić:

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

0

Jeśli naprawdę potrzebujesz zmienić uprawnienia do dowiązań symbolicznych (zwykle bez znaczenia, jak napisano w innych odpowiedziach), udało mi się użyć -Ropcji chown:

chown -R myuser:mygroup link

Jeśli -Rnie był używany, uprawnienia nie zostały zmienione.


Będzie to działać z GNU, chownponieważ jest to -Rsugerowane -P, jednak nie jest to gwarantowane i nie będzie działać w niektórych innych implementacjach chown. Standardowym sposobem zmiany własności dowiązania symbolicznego jest -hopcja. Właśnie zaktualizowałem zaakceptowaną odpowiedź, która była niepoprawna.
Stéphane Chazelas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.