BEZEICHNUNG
chown, fchown, lchown, fchownat - Besitzverhältnisse einer Datei ändernBIBLIOTHEK
Standard-C-Bibliothek ( libc, -lc)ÜBERSICHT
#include <unistd.h>
int chown(const char *Pfadname, uid_t Eigentümer, gid_t Gruppe); int fchown(int fd, uid_t Eigentümer, gid_t Gruppe); int lchown(const char *Pfadname, uid_t Eigentümer, gid_t Gruppe);
#include <fcntl.h> /* Definition der AT_*-Konstanten */ #include <unistd.h>
int fchownat(int dirfd, const char *Pfadname, uid_t Eigentümer, gid_t Gruppe, int Schalter);
Mit Glibc erforderliche Feature-Test-Makros
(siehe feature_test_macros(7)):
fchown(), lchown():
/* Seit Glibc 2.12: */ _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 500 || /* Glibc <= 2.19: */ _BSD_SOURCEfchownat():
Seit Glibc 2.10: _POSIX_C_SOURCE >= 200809L Vor Glibc 2.10: _ATFILE_SOURCE
BESCHREIBUNG
Diese Systemaufrufe ändern den Eigentümer und die Gruppe einer Datei. Die Systemaufrufe fchown() und lchown() unterscheiden sich nur in der Angabe der Datei:- •
- chown() ändert die Besitzverhältnisse der von Pfadname angegebenen Datei. Falls das ein symbolischer Link ist, wird er dereferenziert.
- •
- fchown() ändert die Besitzverhältnisse der Datei, die über den offenen Dateideskriptor fd angegeben wird.
- •
- lchown() ist wie chown(), dereferenziert aber keine symbolischen Links.
fchownat()
Der Systemaufruf fchownat() funktioniert genauso wie chown, außer den hier beschriebenen Unterschieden. Falls der in Pfadname übergebene Pfadname relativ ist wird er als relativ zu dem im Dateideskriptor dirfd referenzierten Verzeichnis interpretiert (statt relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses, wie es bei chown() für einen relativen Pfadnamen erfolgt). Falls Pfadname relativ ist und dirfd den besonderen Wert AT_FDCWD annimmt wird Pfadname als relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses interpretiert (wie chown()). Falls Pfadname absolut ist, wird Verzdd ignoriert. Das Schalter-Argument ist eine Bitmaske, die durch bitweises ODER null oder mehr der folgenden Werte enthält:- AT_EMPTY_PATH (seit Linux 2.6.39)
- Falls Pfadname eine leere Zeichenkette ist, wird mit der Datei gearbeitet, auf die dirfd verweist (dies kann mit dem O_PATH-Schalter von open(2) ermittelt werden). In diesem Fall kann sich dirfd auf jeden Dateityp beziehen, nicht nur einem Verzeichnis. Falls dirfd AT_FDCWD ist, erfolgt der Aufruf im aktuellen Arbeitsverzeichnis. Dieser Schalter ist Linux-spezifisch; definieren Sie _GNU_SOURCE, um dessen Definition zu ermitteln.
- AT_SYMLINK_NOFOLLOW
- Wenn pathanme ein symbolischer Link ist, wird er nicht dereferenziert: es wird stattdessen mit dem Link selbst gearbeitet, wie bei lchown(). In der Voreinstellung dereferenziert fchownat() symbolische Links, wie chown().
RÜCKGABEWERT
Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1 zurückgegeben und errno gesetzt, um den Fehler anzuzeigen.FEHLER
Je nach Dateisystem können andere als die unten aufgeführten Fehler zurückgegeben werden. Die allgemeineren Fehler von fchown() sind im Folgenden aufgeführt:- EACCES
- Eine Komponente des Pfad-Präfix darf nicht durchsucht werden. (Siehe auch path_resolution(7).)
- EBADF
- (fchown()) dd ist kein zulässiger offener Dateideskriptor.
- EBADF
- (fchownat()) Pfadname ist relativ, aber Verzdd ist weder AT_FDCWD noch ein gültiger Dateideskriptor.
- EFAULT
- Pfadname zeigt aus dem für Sie zugänglichen Adressraum heraus.
- EINVAL
- (fchownat()) Unzulässiger Schalter in Schalter angegeben.
- EIO
- (fchown()) Bei der Bearbeitung des Inodes trat ein system-/hardwarenaher E/A-Fehler (engl. I/O) auf.
- ELOOP
- Bei der Auflösung von Pfadname wurden zu viele symbolische Links gefunden.
- ENAMETOOLONG
- Pfadname ist zu lang.
- ENOENT
- Die Datei existiert nicht.
- ENOMEM
- Es war nicht genügend Kernelspeicher verfügbar.
- ENOTDIR
- Eine Komponente des Pfad-Präfixes ist kein Verzeichnis.
- ENOTDIR
- (fchownat()) Pfadname ist relativ und Verzdd ist ein Dateideskriptor, der sich auf eine Datei bezieht, die kein Verzeichnis ist.
- EPERM
- Der aufrufende Prozess hatte nicht die benötigten Rechte (siehe oben), um den Eigentümer und/oder die Gruppe zu ändern.
- EPERM
- Die Datei ist als unveränderlich oder nur-anhängbar markiert (siehe ioctl_iflags(2)).
- EROFS
- Die angegebene Datei befindet sich auf einem nur lesbaren (read-only) Dateisystem.
VERSIONEN
fchownat() wurde zu Linux 2.6.16 hinzugefügt; Bibliotheksunterstützung wurde in Glibc 2.4 hinzugefügt.STANDARDS
chown(), fchown(), lchown(): 4.4BSD, SVr4, POSIX.1-2001, POSIX.1-2008. Die Version aus 4.4BSD kann nur vom Superuser verwendet werden (d.h. normale Benutzer können keine Dateien weggeben). fchownat(): POSIX.1-2008.ANMERKUNGEN
Eigentümerschaft neuer Dateien
Wenn eine neue Datei erzeugt wird (zum Beispiel durch open(2) oder mkdir(2)), wird der Eigentümer der gleiche wie die Dateisystem-Benutzer-ID des erzeugenden Prozesses. Die Gruppe der Datei hängt von einer Reihe von Faktoren ab, einschließlich der Art des Dateisystems, den beim Einhängen des Dateisystems verwendeten Optionen und der (Nicht-) Aktivierung des Set-Group-ID-Modusbits für das Elternverzeichnis. Falls das Dateisystem die Optionen -o grpid (oder synonym -o bsdgroups) und -o 0grpid (oder synonym -o sysvgroups) von mount(8) unterstützt, dann sind die Vorschriften wie folgt:- •
- Falls das Dateisystem mit -o grpid eingehängt wurde, wird die Gruppe der neuen Datei vom Elternverzeichnis übernommen.
- •
- Falls das Dateisystem mit -o nogrpid eingehängt wurde und das Set-Group-ID-Bit wurde für das Elternverzeichnis deaktiviert, wird die Gruppe einer neuen Datei auf die Dateisystem-GID des Prozesses gesetzt.
- •
- Falls das Dateisystem mit -o nogrpid eingehängt wurde und das Set-Group-ID-Bit wurde für das Elternverzeichnis aktiviert, wird die Gruppe einer neuen Datei vom Elternverzeichnis übernommen.
Anmerkungen zur Glibc
Mit älteren Kernels, in denen fchownat() nicht verfügbar ist, weicht die Glibc-Wrapper-Funktion auf chown() und lchown() aus. Wenn Pfadname ein relativer Pfadname ist, dann konstruiert die Glibc einen Pfadnamen, der auf jenem symbolischen Link in /proc/self/fd, der dem Argument dirfd entspricht.NFS
Die Semantik von chown() wird auf NFS-Dateisystemen mit aktiviertem UID-Mapping bewusst verletzt. Außerdem wird bei allen Systemaufrufen, die auf den Dateiinhalt zugreifen, die Semantik verletzt, da chown() einen sofortigen Entzug des Zugriffs bei bereits geöffneten Dateien bewirken kann. Zwischenspeicherung (Caching) seitens des Clients kann zu einer Verzögerung zwischen dem Zeitpunkt der Änderung der Besitzverhältnisse, um einem Benutzer Zugriff zu ermöglichen, und dem Zeitpunkt, zu dem er auf anderen Clients tatsächlich zugreifen kann, führen.Geschichtliche Details
Die ursprünglichen Linux-Systemaufrufe chown(), fchown() und lchown() unterstützten nur 16-Bit-Benutzer- und Gruppenkennungen. Anschließend fügte Linux 2.4 chown32(), fchown32() und lchown32() zur Unterstützung von 32-Bit-Kennungen hinzu. Die Glibc-Wrapper-Funktionen chown(), fchown() und lchown() gehen transparent mit den Variationen zwischen den Kernel-Versionen um. Vor Linux 2.1.81 (außer 2.1.46) folgte chown() symbolischen Links nicht. Seit Linux 2.1.81 folgt chown() symbolischen Links und es gibt einen neuen Systemaufruf lchown(), der symbolischen Links nicht folgt. Ab Linux 2.1.86 hat dieser neue Aufruf (der die gleiche Semantik wie das alte chown() hat) die gleiche Systemaufruf-Nummer (syscall number) und chown() erhielt die neu eingeführte Nummer.BEISPIELE
Das folgende Programm ändert den Eigentümer der Datei im zweiten Befehlszeilen-Argument auf den Wert, der als erstes Befehlszeilen-Argument angegeben wird. Der neue Besitzer kann entweder als numerische Benutzerkennung oder als Benutzername (die mittels getpwnam(3) durch einen Suchlauf in der System-Passwortdatei in eine Benutzerkennung umgewandelt wird) angegeben werden.Programmquelltext
#include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { char *endptr; uid_t uid; struct passwd *pwd; if (argc != 3 || argv[1][0] == '\0') { fprintf(stderr, "%s <Eigentümer> <Datei>\n", argv[0]); exit(EXIT_FAILURE); } uid = strtol(argv[1], &endptr, 10); /* eine numerische Zeichenkette erlauben */ if (*endptr != '\0' { /* Zeichenkette war nicht rein numerisch */ pwd = getpwnam(argv[1]); /* versuchen, UID für den Benutzernamen zu bestimmen */ if (pwd == NULL) { perror("getpwnam"); exit(EXIT_FAILURE); } uid = pwd->pw_uid; } if (chown(argv[2], uid, -1) == -1) { perror("chown"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }
SIEHE AUCH
chgrp(1), chown(1), chmod(2), flock(2), path_resolution(7), symlink(7)ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Florian Jenn <[email protected]>, Martin Eberhard Schauer <[email protected]>, Mario Blättermann <[email protected]>, Dr. Tobias Quathamer <[email protected]> und Helge Kreutzmann <[email protected]> erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer5. Februar 2023 | Linux man-pages 6.03 |