Wie gelten Dateiberechtigungen für Symlinks?

93

Nehmen wir an, Sie haben diese Struktur:

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

file3ist ein Link zu einem file3anderen Ort im System.

Nun sagen wir ich chmod 777das Verzeichnis und alle Inhalte darin. Hat mein file3in /tmpdiese Berechtigungen erhalten? Nehmen wir auch an, wir haben die gleiche Situation, aber umgekehrt.

/tmp/file3 -> /directory/file3

Wie wirkt sich das auf die Verknüpfung aus, wenn ich die Berechtigungen für die verknüpfte Datei anwende?

n0pe
quelle
Berechtigungen wirken sich nur auf die Datei aus, nicht auf den Symlink.
Baraboom

Antworten:

90

Dies hängt davon ab, wie Sie anrufen chmodund auf welcher Plattform Sie arbeiten.

Auf einem Linux-System man chmodheißt es beispielsweise:

chmod Ändert niemals die Berechtigungen von symbolischen Links. Der chmod Systemaufruf kann ihre Berechtigungen nicht ändern. Dies ist kein Problem, da die Berechtigungen von symbolischen Links niemals verwendet werden. Ändert jedoch für jede in der Befehlszeile aufgeführte symbolische Verknüpfung chmoddie Berechtigungen der Datei, auf die verwiesen wird. chmodIgnoriert im Gegensatz dazu symbolische Links, die bei rekursiven Verzeichnisdurchläufen auftreten.

Auf einem Mac kann chmod jedoch verwendet werden, um die Berechtigungen eines symbolischen Links mit folgenden Optionen (von man chmod) zu ändern :

-h Wenn die Datei eine symbolische Verknüpfung ist, ändern Sie den Modus der Verknüpfung selbst und nicht die Datei, auf die die Verknüpfung verweist.

Nehmen wir zum Beispiel an, dass Sie sich für den Rest dieser Antwort auf einem Linux-Computer befinden.

Wenn Sie im ersten Fall chmod -R 777 directorydie Berechtigungen rekursiv ändern, ist das Verknüpfungsziel nicht betroffen. Wenn Sie dies jedoch tun chmod 777 directory/*, ist dies der Fall .

Wenn Sie die Berechtigungen für das Linkziel direkt ändern, werden diese Berechtigungen durchgesetzt (da, wie in der Manpage und in Baraboom angegeben , die tatsächlichen Linkberechtigungen für nichts verwendet werden).


Testprotokoll zur Veranschaulichung:

$ 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
peth
quelle
2
Das war auch für mich eine Überraschung. Nächste Frage: Was bedeuten die Berechtigungen für einen Symlink ?
Edward Falk
@EdwardFalk-Symlink-Berechtigungen sind nicht einschränkend, da alles in der Lage sein muss, sie zu durchlaufen, um die Berechtigungen aus der verknüpften Datei abzurufen.
Walf
5

Die Antworten von baraboom und peth sind beide richtig: Berechtigungsbits für die symbolischen Links selbst sind irrelevant (außer unter macOS; siehe unten), und das Ändern der Berechtigung für einen symbolischen Link - über das chmodBefehlszeilentool oder über den chmod()Systemaufruf - fungiert einfach als wenn es gegen das Ziel der symbolischen Verbindung durchgeführt wurde.

So zitieren Sie die SUSv4 / POSIX.1-2008-Beschreibung des Systemaufrufs symlink () :

Die Werte der Dateimodusbits für die erstellte symbolische Verknüpfung sind nicht angegeben. Alle von POSIX.1-2008 angegebenen Schnittstellen müssen sich so verhalten, als ob der Inhalt symbolischer Links immer gelesen werden kann, mit der Ausnahme, dass der Wert der im Feld st_mode der stat- Struktur zurückgegebenen Dateimodusbits nicht angegeben ist.

Hier lässt "nicht spezifiziert" Interpretationsspielraum für jede Implementierung. Besonderheiten:

  • Gibt unter Linux (getestet mit ext4fs) stat()zurück st_mode=0777, unabhängig davon, wie die Umask lautete, als der Symlink erstellt wurde. ls -lwird daher immer lrwxrwxrwxfür symbolische Verknüpfungen angezeigt .
  • Unter macOS (HFS) und FreeBSD (sowohl UFS als auch ZFS) verfügt eine symbolische Verknüpfung über eine eigene Berechtigung: Der oben angegebene chmod -hBefehl kann diese Verknüpfungsberechtigung (die intern einen Nicht-POSIX lchown()-Systemaufruf verwendet, um dies zu erreichen) und das stat()System ändern call liefert diesen Wert für st_mode.

Symbolische Links unter Linux und FreeBSD können immer befolgt werden, wie von POSIX angegeben. Insbesondere unter FreeBSD bedeutet dies, dass der Dateimodus einer symbolischen Verknüpfung keinerlei Auswirkung auf die Zugriffssteuerung hat.

Auf der anderen Seite unterbricht macOS POSIX leicht. Ein symbolischer Link kann zwar unabhängig von seiner Leseberechtigung verfolgt werden, readlink()schlägt jedoch mit EACCES(Berechtigung verweigert) fehl, wenn der Benutzer keine Leseberechtigung hat:

$ 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

(Beachten Sie, dass der -> targetTeil in der Ausgabe des zweiten ls -lBefehls fehlt cat symlinkund der Inhalt der targetDatei trotzdem erfolgreich gedruckt wurde , obwohl der Benutzer keine Leseberechtigung für hatte symlink.)

NetBSD bietet anscheinend eine spezielle Mount-Option mit dem Namen, sympermdie, falls gesetzt, symbolische Link-Lese- / Ausführungsberechtigungen zur Steuerung readlink()und zum Link-Traversal verursacht.

astralblau
quelle
-1
  1. Löschen Sie die Link-Datei (nachdem Sie sichergestellt haben, dass sie von keinem Prozess verwendet wird)
  2. setze umask so, dass 777-umask = Dateiberechtigungen benötigt
  3. Erstellen Sie die Link-Datei erneut
AVA
quelle
3
Wie beantwortet dies die Frage?
Jww