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 -h
Option 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_options
hat 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 chmod
Dienstprogramms 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 fchmodat
besteht darin, die Funktion bereitzustellen, nach der Sie gefragt haben. Das Befehlszeilenprogramm chmod
wird 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_NOFOLLOW
in diesen Anrufen: faccessat
, fchownat
, fstatat
, utimensat
, und linkat
wurde 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.