Die Berechtigungen des Symlinks selbst sind unerheblich. Sie konnten sie nicht einmal ändern, wenn Sie es versuchten.
Was zählt, sind die Berechtigungen der zugrunde liegenden Datei.
Es ist in Ordnung, dass Verzeichnisse in Ihrem PATH Symlinks zu ausführbaren Dateien enthalten. Tatsächlich ist es wahrscheinlich, dass viele ausführbare Dateien in Ihrem PATH Symlinks sind. Zum Beispiel auf Debian / Ubuntu-ähnlichen Systemen:
$ ls -l /bin/sh lrwxrwxrwx 1 root root 4 Jan 23 2017 /bin/sh -> dash
Dokumentation
Von man chmod
:
chmod ändert niemals die Berechtigungen symbolischer Links. Der chmod-Systemaufruf kann seine Berechtigungen nicht ändern. Dies ist kein Problem, da die Berechtigungen symbolischer Links niemals verwendet werden. Für jeden in der Befehlszeile aufgelisteten symbolischen Link ändert chmod jedoch die Berechtigungen der Datei, auf die verwiesen wird. Im Gegensatz dazu ignoriert chmod symbolische Links, die während rekursiver Verzeichnisdurchquerungen gefunden wurden. [Betonung hinzugefügt.]
Beispiel
Die Shell hat einen Test, -x
um festzustellen, ob eine Datei ausführbar ist. Versuchen wir das mal:
$ ls -l total 0 lrwxrwxrwx 1 john1024 john1024 7 Dec 12 23:36 foo -> foobar1 -rw-rw---- 1 john1024 john1024 0 Dec 12 23:36 foobar1 $ [ -x foo ] && echo foo is executable $ chmod +x foobar1 $ [ -x foo ] && echo foo is executable foo is executable
So wie Sie es mit gefunden haben which
, betrachtet die Shell eine Softlink-Programmdatei nicht, es sei denn, die zugrunde liegende Datei ist ausführbar.
Wie das funktioniert
Auf einem Debian-System which
ist ein Shell-Skript. Der relevante Abschnitt des Codes ist:
case $PROGRAM in */*) if [ -f "$PROGRAM" ] && [ -x "$PROGRAM" ]; then puts "$PROGRAM" RET=0 fi ;; *) for ELEMENT in $PATH; do if [ -z "$ELEMENT" ]; then ELEMENT=. fi if [ -f "$ELEMENT/$PROGRAM" ] && [ -x "$ELEMENT/$PROGRAM" ]; then puts "$ELEMENT/$PROGRAM" RET=0 [ "$ALLMATCHES" -eq 1 ] || break fi done ;; esac
Wie Sie sehen, verwendet es den -x
Test, um festzustellen, ob eine Datei ausführbar ist.
POSIX spezifiziert den -x
Test wie folgt:
-x Pfadname
True, wenn Pfadname in einen vorhandenen Verzeichniseintrag für eine Datei aufgelöst wird, für die die Berechtigung zum Ausführen der Datei (oder zum Durchsuchen dieser Datei, wenn es sich um ein Verzeichnis handelt) erteilt wird, wie in Datei Lesen, Schreiben und Erstellen definiert. False, wenn Pfadname nicht aufgelöst werden kann oder wenn Pfadname in einen vorhandenen Verzeichniseintrag für eine Datei aufgelöst wird, für die die Berechtigung zum Ausführen (oder Suchen) der Datei nicht erteilt wird. [Betonung hinzugefügt.]
So prüft POSIX, was der Pfad löst zu. Mit anderen Worten, es akzeptiert symbolische Links.
POSIX-Exec-Funktion
Die POSIX-Exec-Funktion folgt Symlinks. Die POSIX-Spezifikation beschreibt ausführlich die Fehlerbedingungen, die gemeldet werden können, wenn Symlinks kreisförmig oder zu tief sind, z.
[ELOOP]
Eine Schleife existiert in symbolischen Links, die während der Auflösung des Pfad- oder Dateiarguments aufgetreten sind .
[ELOOP]
Bei der Auflösung des Pfad- oder Dateiarguments wurden mehr als symbolische Links gefunden.
[ENAMETOOLONG]
Durch das Auffinden eines symbolischen Links bei der Auflösung des Pfadarguments überschritt die Länge der ersetzten Pfadnamenzeichenfolge .