Wie ändere ich die Symlink-Berechtigung?

8

Ich habe ein Problem: Ich muss die Berechtigung des Symlinks von 777 auf 755 ändern und habe keine Ahnung, wie ich das machen soll. Ich habe versucht, den chmodBefehl zu verwenden, aber er funktioniert nicht. ich möchte

lrwxrwxrwx  1 frosu  2016_cluj     5 Jul  4 13:53 test6 -> test0

zu

lrwxr-xr-x 1 frosu  2016_cluj     5 Jul  4 13:53 test6 -> test0
JohnnyOnPc
quelle
1
Siehe meine Antwort unten: Die Berechtigungen von Symlinks werden normalerweise nicht bewertet. Ob Sie diese Bits ändern können oder nicht, hängt davon ab, ob Ihr Betriebssystem POSIX.1-2008 unterstützt
schily

Antworten:

16

Einige Systeme unterstützen das Ändern der Berechtigung einer symbolischen Verknüpfung, andere nicht.

  • chmod - Dateimodi oder Zugriffssteuerungslisten ändern (OSX und FreeBSD , mit -h)

    -h Wenn es sich bei der Datei um einen symbolischen Link handelt, ändern Sie den Modus des Links selbst und nicht die Datei, auf die der Link verweist.

  • chmod - Dateimodusbits ändern (Linux)

    chmodÄndert niemals die Berechtigungen symbolischer Links. Der Systemaufruf chmod kann seine Berechtigungen nicht ändern. Dies ist kein Problem, da die Berechtigungen für symbolische 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 bei rekursiven Verzeichnisdurchläufen auftreten.

Da sich die Funktion unterscheidet, erwähnt POSIX die Möglichkeit nicht.

Aus Kommentaren geht hervor, dass eine kürzlich vorgenommene Änderung der GNU-Coreutils die -hOption bietet . Im Moment erscheint das nicht im Quellcode für chmod :

  while ((c = getopt_long (argc, argv,
                           ("Rcfvr :: w :: x :: X :: s :: t :: u :: g :: o :: a ::, :: + :: = ::"
                            "0 :: 1 :: 2 :: 3 :: 4 :: 5 :: 6 :: 7 ::"),
                           long_options, NULL))

und long_optionshat dies:

static struct option const long_options[] =
{
  {"changes", no_argument, NULL, 'c'},
  {"recursive", no_argument, NULL, 'R'},
  {"no-preserve-root", no_argument, NULL, NO_PRESERVE_ROOT},
  {"preserve-root", no_argument, NULL, PRESERVE_ROOT},
  {"quiet", no_argument, NULL, 'f'},
  {"reference", required_argument, NULL, REFERENCE_FILE_OPTION},
  {"silent", no_argument, NULL, 'f'},
  {"verbose", no_argument, NULL, 'v'},
  {GETOPT_HELP_OPTION_DECL},
  {GETOPT_VERSION_OPTION_DECL},
  {NULL, 0, NULL, 0}
};

Berechtigungen werden mit festgelegt chmod. Das Eigentum ist festgelegt mit chown. GNU-Coreutils (wie BSD) unterstützen die Möglichkeit, den Besitz eines symbolischen Links zu ändern. Dies ist eine andere Funktion, da der Besitz eines symbolischen Links davon abhängt, ob der Inhalt des Links geändert werden kann (und auf ein anderes Ziel verwiesen werden kann). Dies begann wiederum als BSD-Funktion (OSX, FreeBSD usw.), die auch unter Linux (und Solaris usw.) unterstützt wird. POSIX sagt über diese Funktion :

-h
Für jeden Dateioperanden, der eine Datei vom Typ symbolische Verknüpfung benennt, versucht chown, die Benutzer-ID der symbolischen Verknüpfung festzulegen. Wenn eine Gruppen-ID angegeben wurde, versucht chown für jeden Dateioperanden, der eine Datei vom Typ symbolische Verknüpfung benennt, die Gruppen-ID der symbolischen Verknüpfung festzulegen.

Soviel zu den Befehlszeilentools (und Shell-Skripten). Sie können jedoch Ihr eigenes Dienstprogramm schreiben , indem Sie eine Funktion von POSIX verwenden, die in der Diskussion des chmodDienstprogramms nicht erwähnt wird :

int chmod(const char *path, mode_t mode);
int fchmodat(int fd, const char *path, mode_t mode, int flag);

Die letztere Funktion fügt einen Flag- Parameter hinzu, der folgendermaßen beschrieben wird:

Die Werte für das Flag werden durch ein bitweises ODER von Flags aus der folgenden Liste erstellt, definiert in <fcntl.h>:

AT_SYMLINK_NOFOLLOW
Wenn der Pfad eine symbolische Verknüpfung benennt, wird der Modus der symbolischen Verknüpfung geändert.

Das heißt, der Zweck von fchmodatbesteht darin, die Funktion bereitzustellen, nach der Sie gefragt haben. Das Befehlszeilenprogramm chmodwird jedoch (bisher) nur in Bezug auf chmod(ohne diese Funktion) dokumentiert .

fchmodatÜbrigens scheint es sich um eine schlecht dokumentierte Funktion von Solaris zu handeln, die vor zehn Jahren von den Red Hat- und GNU-Entwicklern übernommen und von ihnen zur Standardisierung vorgeschlagen wurde:

Nach dem Linux-Programmierschnittstelle , da 2.6.16, Linux unterstützt AT_SYMLINK_NOFOLLOWin diesen Anrufen: faccessat, fchownat, fstatat, utimensat, und linkatwurde in 2.6.18 (beide eher "alte": implemented 2006 nach OSNews ).

Ob die Funktion für Sie nützlich ist oder nicht, hängt von den von Ihnen verwendeten Systemen ab.

Thomas Dickey
quelle
Auf meiner Manpage steht, dass AT_SYMLINK_NOFOLLOW derzeit nicht implementiert ist.
Joshua
3

Die Berechtigung für Symlinks wird nicht ausgewertet.

Früher gab es keine Möglichkeit, die Berechtigungsbits für Symlinks zu ändern.

Seit einiger Zeit können POSIX fchmodat()und alle Plattformen, die diesen Aufruf unterstützen, die Berechtigungsbits für Symlinks ändern.

Erwarten Sie jedoch keine Auswirkungen auf den Symlink.

schily
quelle