Warum hat Linux / POSIX lchown, aber nicht lchmod?

11

Es scheint, dass Linux das Ändern des Besitzers eines symbolischen Links (dh lchown) unterstützt, das Ändern des Modus / der Berechtigung eines symbolischen Links (dh lchmod) jedoch nicht unterstützt wird . Soweit ich sehen kann, entspricht dies POSIX. Ich verstehe jedoch nicht, warum man eine dieser Operationen unterstützen würde, aber nicht beide. Was ist die Motivation dahinter?

Florian Brucker
quelle
1
Die Berechtigungen eines Symlinks sind immer lrwxrwxrwx. A chmodmacht hier keinen Sinn. Wenn Sie dem Link folgen, gelangen Sie zu den Zielberechtigungen.
ott--
2
@ott: Unter Linux sind die Berechtigungen eines Symlinks immer die, die Sie genau deshalb angegeben haben, weil Linux dies nicht unterstützt lchmod. Andere Unix-ähnliche Betriebssysteme unterstützen dies jedoch (z. B. Mac OS X ). Die Frage ist also, warum Linux dies nicht tut, wenn es unterstützt wird lchown.
Florian Brucker

Antworten:

9

Linux ignoriert wie die meisten Unix-ähnlichen Systeme (Apple OS / X ist eine der seltenen Ausnahmen) die Berechtigungen für Symlinks, wenn es beispielsweise um die Auflösung ihrer Ziele geht.

Der Besitz von Symlinks ist jedoch wie bei anderen Dateien relevant, wenn es um die Berechtigung zum Umbenennen oder Aufheben der Verknüpfung von Einträgen in Verzeichnissen geht, für die das tBit gesetzt ist, z /tmp.

Um eine Datei (Symlink oder nicht) in entfernen oder umbenennen zu können /tmp, müssen Sie der Eigentümer der Datei sein. Dies ist ein Grund, warum man möglicherweise den Besitz eines Symlinks ändern möchte (um die Berechtigung zum Aufheben der Verknüpfung / Umbenennung zu erteilen oder zu entfernen).

$ ln -s / /tmp/x
$ rm /tmp/x
# OK removed

$ ln -s / /tmp/x
$ sudo chown -h nobody /tmp/x
$ rm /tmp/x
rm: cannot remove ‘/tmp/x’: Operation not permitted

Wie von Mark Plotnick in seiner jetzt gelöschten Antwort erwähnt , müssen Sicherungs- und Archivierungsanwendungen außerdem lchown()Symlinks zu ihren ursprünglichen Besitzern wiederherstellen. Eine andere Möglichkeit wäre, vor dem Erstellen des Symlinks zwischen euid und egid zu wechseln. Dies wäre jedoch nicht effizient und erschwert die richtige Verwaltung des Verzeichnisses, in das der Symlink extrahiert wird.

Stéphane Chazelas
quelle
Ich bin nicht sicher, ob dies die ursprüngliche Motivation ist, aber es gibt einen Grund, warum das Design nützlich ist. Vielen Dank!
Florian Brucker
0

Es gibt kein lchmod () in posix, sondern fchmodat (), mit dem die Berechtigungen eines Symlinks festgelegt werden können. Dies erfordert immer noch nicht, dass die Berechtigungen von Symlinks ausgewertet werden.

schily
quelle
1
OP weiß, dass lchmodes nicht mit POSIX übereinstimmt. Was fügt diese Antwort hinzu, die nicht bereits in der Frage enthalten ist?
Muru
Die Operation fragte, warum nur eine der Funktionen unterstützt wird, und ich erklärte, dass praktisch beide verfügbar sind, nur nicht unter dem genannten Namen.
schily
1
Wie? Der Standard besagt : Einige Implementierungen ermöglichen möglicherweise das Ändern des Modus symbolischer Verknüpfungen. Dies wird von den Schnittstellen in der POSIX-Spezifikation nicht unterstützt. Systeme mit einer solchen Unterstützung bieten eine Schnittstelle mit dem Namen lchmod (). Um solche Implementierungen zu unterstützen, verfügt fchmodat () über einen Flag-Parameter. Dies bedeutet lediglich, dass es ein Flag für fchmodat gibt, mit dem die Implementierung die Symlink-Dauerwellen ändern kann. Nicht dass es unbedingt sein könnte.
Muru
Richtig, da die Berechtigungen von Symlinks seit 35 Jahren nicht mehr ausgewertet werden, ist es nicht sinnvoll, die Modi zu ändern. Fchmodat () existiert für Orthogonslity. Der einzige wirkliche Vorteil war futimensat (), da einstellbare Zeitstempel für Symlinks den Menschen helfen, einen Verzeichnisbaum zu verstehen.
schily
@schilly, OS / X berücksichtigt Berechtigungen für Symlinks. Wenn Sie dort keine Leseberechtigungen haben, können Sie deren Ziele nicht auflösen.
Stéphane Chazelas