Ändern Sie die Berechtigungen für einen symbolischen Link

37

Ich habe einen Symlink mit diesen Berechtigungen:

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

Der Symlink befindet sich in einem .tar.gz-Archiv. Wenn ich nun das tar.gz-Archiv mit maven entpacke, ist der Symlink nicht mehr gültig. Ich versuche daher, den Symlink zu rekonstruieren. Zuerst erstelle ich den Symlink mit ln, aber wie lege ich die gleichen Berechtigungen wie beim ursprünglichen Symlink fest?

u123
quelle

Antworten:

59

Sie können einen neuen Symlink erstellen und an die Position des alten Links verschieben.

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

Dadurch bleibt der Linkbesitz erhalten. Alternativ können Sie chownden Eigentümer des Links auch manuell festlegen.

chown -h myuser:myuser npm

Auf den meisten Systemen spielen Symlink-Berechtigungen keine Rolle. Bei Verwendung des Symlinks werden die Berechtigungen der Komponenten des Symlink-Ziels überprüft. Auf einigen Systemen spielen sie jedoch eine Rolle. MacOS benötigt eine Leseberechtigung für den Link readlink, und die sympermMount-Option von NetBSD erzwingt die Überprüfung der Link-Berechtigungen beim Lesen und Durchlaufen. Auf diesen Systemen (und ihren Verwandten, einschließlich FreeBSD und OpenBSD) gibt es eine äquivalente -hOption zu chmod.

chmod -h 777 npm
JdeBP
quelle
1
Ich habe gerade ein Berechtigungsproblem mit Symlinks auf einem CentOS 6.8-Server festgestellt. Die Symlinks hatten Besitzer: Gruppe von root: root. Als der Besitzer und die Gruppe in den Benutzer geändert wurden, dem das Verzeichnis gehörte, in dem sie sich befanden, verschwand das Berechtigungsproblem, wie in dieser Antwort gezeigt.
Nachteule
Nur eine Klarstellung. Wenn Sie den Besitz oder die Rechte an einem Symlink ändern möchten, wirkt sich das Flag -h auf die Symlink-Datei anstelle der dereferenzierten Datei aus.
UltimaWeapon
12

Wenn Sie versuchen, chmoddie Berechtigungen des Links festzulegen, müssen Sie tatsächlich die Berechtigungen des Ziels des Links festlegen. Die Berechtigungen des Links sind bedeutungslos.

Mach es einfach
quelle
2
Was passiert, wenn jemand den Link zu einem bösartigen Code ändert? Der ursprüngliche Code kann sogar etwas sein, auf das root nur zugreifen kann. Zum Beispiel in Crontap-Skripten.
Aliqandil
@aliqandil Im Allgemeinen kann ein Benutzer jede Datei in einem Verzeichnis löschen und neu erstellen, für die er Schreibzugriff hat. In Bash, für eine Datei testmit -rw-rw-r-- root root, für die rm testich die Eingabeaufforderung erhalte rm: remove write-protected regular empty file 'test'?Die Lösung besteht darin, vertrauliche Dateien in Verzeichnissen abzulegen, für die Benutzer nur Lesezugriff haben.
AnOccasionalCashew
5

Wenn Sie einen Link haben wie:

link -> foo/bar

und möchte es ändern in:

link -> new/target

Es sind zwei Fälle zu berücksichtigen:

  1. foo/barist kein Verzeichnis oder existiert nicht oder Sie haben keinen Suchzugriff auf foo. Dann

    ln -s new/target link
    

    wird scheitern, weil linkbereits vorhanden, aber Sie können das mit dem Standard überwinden:

    ln -fs new/target link
    
  2. foo/barist ein Verzeichnis (und Sie haben die Suchberechtigung foo, um feststellen zu können, dass foo/bares sich um ein Verzeichnis handelt). In diesem Fall tun Sie Folgendes:

    ln -s new/target link
    

    oder

    ln -fs new/target link
    

    Darunter versteht man das Erstellen eines neuen targetSymlinks innerhalb des linkVerzeichnisses ( linkist ein Verzeichnis, weil es ein Symlink zum foo/barVerzeichnis ist). Sie erstellen also tatsächlich Folgendes:

    foo/bar/target -> new/target
    

    Um dies zu überwinden, hat GNU lndie -TOption, dass der Linkname immer als Linkname und nicht als Verzeichnis zum Erstellen der Links betrachtet wird. Also mit GNU ln:

    ln -fsT new/target link
    

    wird funktionieren. Wie zuvor wird der ursprüngliche linkSymlink entfernt und neu new/targetals Ziel erstellt (und der Prozess 'euid und egid als Eigentümer).

    GNU lnhat auch eine -nOption. Es funktioniert so, -Taußer wenn linkes sich tatsächlich um ein echtes Verzeichnis handelt. In diesem Fall wird der Symlink immer noch in diesem Verzeichnis erstellt (anstatt mit einem Fehler fehlzuschlagen).

    Portabel ist es am besten, zuerst den Link zu entfernen und ihn dann neu zu erstellen:

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

Auf den meisten Systemen werden Berechtigungen für Symlinks ignoriert und im Allgemeinen auf festgelegt rwxrwxrwx.

Auf Systemen, auf denen Symlink-Berechtigungen von Bedeutung sind (wie OS / X, auf denen Sie Leseberechtigungen für einen Symlink benötigen, um sein Ziel auflösen zu können), gibt es im Allgemeinen eine Möglichkeit, diese zu ändern ( chmod -hunter OS / X).

Der Besitz ist zwar wie oben für den Zugriff auf die Datei, auf die der Symlink verweist,t auf den meisten Systemen nicht relevant, kann jedoch für das Bit des übergeordneten Verzeichnisses oder der Kontingente eine andere Relevanz haben ... ) und es gibt einen Standardbefehl zum Ändern:

chown -h user[:group] the-link
chgrp -h group the-link
Stéphane Chazelas
quelle
0

Wenn Sie die Symlinks-Berechtigung wirklich ändern müssen (normalerweise bedeutungslos, wie in anderen Antworten beschrieben), konnte ich die folgenden -ROptionen erfolgreich verwenden chown:

chown -R myuser:mygroup link

Wenn -Rnicht verwendet, wurden die Berechtigungen nicht geändert.

Miroslav Mocek
quelle
Das wird mit GNU funktionieren, chownweil -Res -Pdort impliziert ist, aber das ist nicht garantiert und wird in einigen anderen Chown-Implementierungen nicht funktionieren. Die Standardmethode zum Ändern der Symlink-Inhaberschaft ist die -hOption. Ich habe gerade die akzeptierte Antwort aktualisiert, die falsch war.
Stéphane Chazelas