CHOWN(2)

BEZEICHNUNG
chown, fchown, lchown - Besitzverhältnisse einer Datei ändern

ÜBERSICHT
#include <unistd.h>

int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);

Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

fchown(), lchown():
    _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
    || /* Seit Glibc 2.12: */ _POSIX_C_SOURCE >= 200809L

BESCHREIBUNG
Diese Systemaufrufe ändern den Eigentümer und die Gruppe einer Datei. Sie unterscheiden sich nur in der Angabe der Datei:

*   chown() ändert die Besitzverhältnisse der von path 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.

Werden 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. 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.

RÜCKGABEWERT
Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt.

FEHLER
Die häufigsten Fehler für chown() sind im Folgenden aufgeführt. Je nach Dateisystem können andere Fehler zurückgegeben werden.

EACCES
    Eine Komponente des Pfad-Präfix darf nicht durchsucht werden. (Siehe auch path_resolution(7).)

EFAULT
    path zeigt aus dem für Sie zugänglichen Adressraum heraus.

ELOOP
    Bei der Auflösung von path wurden zu viele symbolische Links gefunden.

ENAMETOOLONG
    path ist zu lang.

ENOENT
    Die Datei existiert nicht.

ENOMEM
    Es war nicht genügend Kernel-Speicher 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.

EROFS
    Die angegebene Datei befindet sich auf einem nur lesbaren (read-only) Dateisystem.

Die allgemeinen Fehler von fchown() sind im Folgenden aufgeführt:

EBADF
    Der Dateideskriptor ist ungültig.

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.

KONFORM ZU
4.4BSD, SVr4, POSIX.1-2001.

Die Version aus 4.4BSD kann nur vom Superuser verwendet werden (d.h., normale Benutzer können keine Dateien weggeben).

ANMERKUNGEN
Die ursprünglichen Linux-Systemaufrufe chown(), fchown() und lchown() unterstützten nur 16-Bit-Benutzer- und Gruppen-IDs. Anschließend fügte Linux 2.4 chown32(), fchown32() und lchown32() zur Unterstützung von 32-Bit-IDs hinzu. Die Glibc-Wrapper-Funktionen chown(), fchown() und lchown() gehen transparent mit den Variationen zwischen den Kernel-Versionen um.

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-Berechtigungsbits für das übergeordnete Verzeichnis. Falls das Dateisystem die Optionen -o grpid (oder synonym -o bsdgroups) und -o grpid (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 übergeordneten Verzeichnis übernommen.

*   Falls das Dateisystem mit -o nogrpid eingehängt wurde und das Set-Group-ID-Bit wurde für das übergeordnete Verzeichnis 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 übergeordnete Verzeichnis aktiviert, wird die Gruppe einer neuen Datei vom übergeordneten Verzeichnis übernommen.

Seit Linux 2.6.25 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.

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.

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.

BEISPIEL

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 Benutzer-ID oder als Benutzername (die mittels getpwnam(3) durch einen Suchlauf in der System-Passwortdatei in eine Benutzer-ID umgewandelt wird) angegeben werden.

#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
chmod(2), fchownat(2), flock(2), path_resolution(7), symlink(7)

KOLOPHON
This page is part of release 3.54 of the Linux man-pages project. A description of the project, and information about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Florian Jenn <jennf@tu-cottbus.de>, Helge Kreutzmann <debian@helgefjell.de>, Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> und Mario Blättermann <mario.blaettermann@gmail.com> 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@lists.debian.org>.