BEZEICHNUNG
chown, fchown, lchown, fchownat - Besitzverhältnisse einer Datei ändern
ÜBERSICHT
#include <unistd.h>
int
chown(const char *pathname, uid_t
owner, gid_t group);
int fchown(int fd, uid_t owner,
gid_t group);
int lchown(const char *pathname, uid_t
owner, gid_t group);
#include
<fcntl.h> /* Definition der AT_*-Konstanten */
#include <unistd.h>
int
fchownat(int dirfd, const char
*pathname,
uid_t owner, gid_t group,
int flags);
Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):
fchown(), lchown():
/* Seit Glibc 2.12: */
_POSIX_C_SOURCE >= 200809L
|| _XOPEN_SOURCE >= 500
|| /* Glibc-Versionen <= 2.19: */ _BSD_SOURCE
fchownat():
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 pathname angegebenen Datei. Falls das ein symbolischer Link ist, wird er dereferenziert. | ||
* |
fchown() ändert die Besitzverhältnisse der Datei, die über den offenen Dateideskriptor fd festgelegt wird. | ||
* |
lchown() ist wie chown(), dereferenziert aber keine symbolischen Links. |
Nur ein privilegierter Prozess (Linux: verfügt über die CAP_CHOWN-Capability) kann den Eigentümer einer Datei ändern. Der Eigentümer einer Datei kann die Gruppenzugehörigkeit der Datei in jede Gruppe ändern, der er selber angehört. Ein privilegierter Prozess (Linux: mit CAP_SHOWN) kann die Gruppenzugehörigkeit beliebig ändern.
Falls owner oder group als -1 übergeben werden, dann wird diese ID nicht geändert.
Wird der Eigentümer oder die Gruppe einer ausführbaren Datei von einem nicht privilegierten Nutzer geändert, werden die Modus-Bits S_ISUID und S_ISGID gelöscht. POSIX legt nicht fest, ob dies auch dann geschehen sollte, wenn Root das chown() durchführt. Das Verhalten von Linux ist in diesem Falle abhängig von der Kernel-Version; seit Linux 2.2.13 wird root wie jeder andere Benutzer behandelt. Falls die Datei für die Gruppe nicht ausführbar ist (d.h. eine, für die das S_IXGRP-Bit nicht gesetzt ist), zeigt das S_ISGID-Bit verbindliche Sperren (mandatory locks) für die Datei an und wird nicht durch ein chown() gelöscht.
Wenn der Eigentümer oder die Gruppe einer Programmdatei (durch igendeinen Benutzer) geändert werden, werden alle Capability-Mengen für diese Datei zurückgesetzt.
fchownat()
Der Systemaufruf fchownat() funktioniert genauso wie
chown, außer den hier beschriebenen
Unterschieden.
Falls der in pathname ü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 pathname relativ ist und dirfd den besonderen Wert AT_FDCWD annimmt wird pathname als relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses interpretiert (wie chown()).
Falls Pfadname absolut ist wird dirfd 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 der Pfadname 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().
Lesen Sie openat(2) für eine Beschreibung der Notwendigkeit von fchownat().
RÜCKGABEWERT
Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt.
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).) | ||
EFAULT |
pathname zeigt aus dem für Sie zugänglichen Adressraum heraus. | ||
ELOOP |
Bei der Auflösung von pathname wurden zu viele symbolische Links gefunden. |
ENAMETOOLONG
pathname 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.
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. |
Die allgemeinen Fehler von fchown() sind im Folgenden aufgeführt:
EBADF |
fd ist kein zulässiger offener Dateideskriptor. | ||
EIO |
Bei der Bearbeitung des Inodes trat ein system-/hardwarenaher E/A-Fehler (engl. I/O) auf. | ||
ENOENT |
Siehe oben. | ||
EPERM |
Siehe oben. | ||
EROFS |
Siehe oben. |
Die gleichen Fehler, die bei chown() auftreten, können auch bei fchownat auftreten. Die folgenden zusätzlichen Fehler können bei fchownat() auftreten:
EBADF |
dirfd ist kein zulässiger Dateideskriptor. |
|||
EINVAL |
Unzulässiger Schalter in flags angegeben. |
ENOTDIR
Pfadname ist relativ und dirfd ist ein Dateideskriptor, der sich auf eine Datei bezieht, die kein Verzeichnis ist.
VERSIONEN
fchownat() wurde zu Linux in Kernel 2.6.16 hinzugefügt; Bibliotheksunterstützung wurde in Glibc in Version 2.4 hinzugefügt.
KONFORM ZU
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. |
Unter Linux 4.12 werden die Einhängeoptionen -o grpid und -o nogrpid von ext2, ext3, ext4 und XFS unterstützt. Dateisysteme, die diese Optionen nicht unterstützen, folgen den -o nogrpid-Regeln.
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.
In Linux-Versionen vor 2.1.81 (außer 2.1.46) folgte chown() nicht symbolischen Links. 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[]) { uid_t uid; struct passwd *pwd; char *endptr; 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') { /* String 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)
KOLOPHON
Diese Seite ist Teil der Veröffentlichung 5.07 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Florian Jenn <jennf [AT] tu-cottbus.de>, Martin Eberhard Schauer <Martin.E.Schauer [AT] gmx.de>, Mario Blättermann <mario.blaettermann [AT] gmail.com>, Dr. Tobias Quathamer <toddy [AT] debian.org> und Helge Kreutzmann <debian [AT] helgefjell.de> 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 <debian-l10n-german [AT] lists.org>.