ACCESS(2)

BEZEICHNUNG
access, faccessat - prüft die Zugriffsrechte des Benutzers an einer Datei

ÜBERSICHT
#include <unistd.h>

int access(const char *pathname, int mode);
#include <fcntl.h>           /* Definition der AT_*-Konstanten */
#include <unistd.h>

int faccessat(int dirfd, const char *pathname, int mode, int flags);

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

faccessat():
    Seit Glibc 2.10:
        _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
    Bis Glibc 2.10:
        _ATFILE_SOURCE

BESCHREIBUNG
access() prüft, ob der Prozess auf die Datei pathname zugreifen kann. Falls pathname ein symbolischer Link ist, werden die Zugriffsrechte der referenzierten Datei geprüft. mode legt fest, welche Zugriffsprüfungen durchgeführt werden sollen. Das ist entweder der Wert F_OK oder eine Bitmaske, die aus einem der Werte R_OK, W_OK, X_OK und F_OK besteht (oder dem bitweisen ODER mehrerer dieser Werte). F_OK überprüft, ob die Datei existiert. R_OK, W_OK und X_OK überprüfen, ob die Datei existiert und entsprechend Lese-, Schreib- und Ausführungsrechte gewährt. Diese Prüfung wird mit der realen UID und der realen GID des Prozesses durchgeführt und nicht mit den effektiven IDs, wie das beim tatsächlichen Versuch, eine Operation auszuführen, der Fall ist (z.B. mit open(2) auf eine Datei zugreifen). Dadurch können »set-UID«-Programme die Berechtigungen des Aufrufenden feststellen. Falls der aufrufende Prozess privilegiert ist (d. h., seine reale UID ist null), wird eine X_OK-Prüfung für eine reguläre Datei erfolgreich sein, wenn Ausführungsrechte für Eigentümer, Gruppe oder Andere gegeben sind.

  faccessat()
Der Systemaufruf faccessat() funktioniert genauso wie access(), außer mit den hier beschriebenen Unterschieden. Falls der in pathname übergebene Pfadname relativ ist wird er als relativ zu dem vom Dateideskriptor dirfd referenzierten Verzeichnis interpretiert (statt relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses, wie es bei access() für einen relativen Pfadnamen erfolgt). Falls pathname relativ ist und dirfd den speziellen Wert AT_FDCWD annimmt, wird pathname als relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses interpretiert (wie access()). Falls pathname absolut ist wird dirfd ignoriert. flags is constructed by ORing together zero or more of the following values:

AT_EACCESS
    Perform access checks using the effective user and group IDs. By default, faccessat() uses the real IDs (like access()).

AT_SYMLINK_NOFOLLOW
    If pathname is a symbolic link, do not dereference it: instead return information about the link itself.

Lesen Sie openat(2) für eine Beschreibung der Notwendigkeit von faccessat().

RÜCKGABEWERT
Bei Erfolg (alle abgefragten Zugriffsrechte sind gegeben oder mode ist F_OK und die Datei existiert) wird Null zurückgegeben. Bei einem Fehler (mindestens eine in mode abgefragte Zugriffsart fehlt oder mode ist F_OK und die Datei existiert nicht oder ein anderer Fehler trat auf) wird -1 zurückgegeben und errno entsprechend gesetzt.

FEHLER
access() und faccessat() schlagen fehl, falls:

EACCES
    Die abgefragte Zugriffsart auf die Datei würde verwehrt oder das Suchen in einer der Dateien des Pfad-Präfixes wurde verwehrt (siehe auch path_resolution(7)).

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

ENAMETOOLONG
    pathname ist zu lang.

ENOENT
    Eine Komponente von Pfadname existiert nicht oder ist ein toter symbolischer Link.

ENOTDIR
    Eine als Verzeichnis benutzte Komponente von pathname ist kein Verzeichnis.

EROFS
    Es wurde Schreibberechtigung für eine Datei auf einem nur lesbaren Dateisystem abgefragt.

access() und faccessat() können fehlschlagen, falls:

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

EINVAL
    mode wurde falsch angegeben.

EIO Es ist ein E/A-Fehler (engl. I/O) aufgetreten.

ENOMEM
    Es war nicht genügend Kernel-Speicher verfügbar.

ETXTBSY
    Es wurde Schreibzugriff für ein ausführbares Programm abgefragt, das gerade ausgeführt wird.

Die folgenden Fehler können bei faccessat() zusätzlich auftreten:

EBADF
    dirfd ist kein zulässiger Dateideskriptor.

EINVAL
    Invalid flag specified in flags.

ENOTDIR
    pathname is relative and dirfd is a file descriptor referring to a file other than a directory.

VERSIONEN
faccessat() wurde zu Linux in Kernel 2.6.16 hinzugefügt; Bibliotheksunterstützung wurde in Glibc in Version 2.4 hinzugefügt.

KONFORM ZU
access(): SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008. faccessat(): POSIX.1-2008.

ANMERKUNGEN

Warning: Using these calls to check if a user is authorized to, for example, open a file before actually doing so using open(2) creates a security hole, because the user might exploit the short time interval between checking and opening the file to manipulate it. For this reason, the use of this system call should be avoided. (In the example just described, a safer alternative would be to temporarily switch the process's effective user ID to the real ID and then call open(2).)

access() löst immer symbolische Links auf. Wenn Sie Rechte eines symbolischen Links prüfen müssen, verwenden Sie faccessat(2) mit dem Schalter AT_SYMLINK_NOFOLLOW.

Diese Aufrufe geben einen Fehler zurück, wenn irgendeine der Zugriffsarten in mode verwehrt wird, sogar wenn einige der anderen Zugriffsarten in mode gestattet sind.

Falls der aufrufende Prozess über entsprechende Privilegien verfügt (d. h. Superuser ist), gestattet POSIX.1-2001 einer Implementierung für eine X_OK-Prüfung Erfolg zu melden, auch wenn keines der Datei-Ausführungsbits gesetzt ist. Linux tut das nicht.

Auf eine Datei kann nur zugegriffen werden, wenn jedes der Verzeichnisse im Pfad-Präfix von pathname suchenden (d. h. ausführenden) Zugriff zullässt. Wenn auf irgendein Verzeichnis nicht zugegriffen werden kann, wird unabhängig von den Zugriffsrechten für die Datei selbst der Aufruf von access() fehlschlagen.

Nur die Zugriffs-Bits werden geprüft, nicht der Dateityp oder -inhalt. Deshalb bedeutet ein als beschreibbar erkanntes Verzeichnis wahrscheinlich, dass in ihm Dateien erstellt werden können und nicht, dass das Verzeichnis als Datei geschrieben werden kann. Ebenso kann eine DOS-Datei als »ausführbar« diagnostiziert werden, aber ein Aufruf von execve(2) kann immer noch fehlschlagen.

Diese Aufrufe arbeiten wahrscheinlich nicht korrekt mit NFS-Dateisystemen, für die UID-Mapping aktiviert ist, weil das UID-Mapping auf dem Server erfolgt und dem Client, der die Berechtigungen prüft, verborgen bleibt (NFS-Versionen ab 3 führen die Überprüfung auf dem Server aus). Ähnliche Probleme können mit FUSE-Einhängungen auftreten.

  faccessat ()
The raw faccessat() system call takes only the first three arguments. The AT_EACCESS and AT_SYMLINK_NOFOLLOW flags are actually implemented within the glibc wrapper function for faccessat(). If either of these flags is specified, then the wrapper function employs fstatat(2) to determine access permissions.

FEHLER
Im Kernel 2.4 (und früher) ist das Verhalten bei der Handhabung von X_OK-Prüfungen für Superuser etwas seltsam. Falls alle Kategorien der Ausführungsberechtigung deaktiviert sind für eine Datei, die kein Verzeichnis ist, gibt nur die Zugriffsprüfung -1 zurück, für die mode lediglich als X_OK angegeben ist; falls auch R_OK oder W_OK in mode angegeben ist, gibt access() für solche Dateien 0 zurück. Frühe 2.6-Kernel (bis einschließlich 2.6.3) verhielten sich in der gleichen Weise wie 2.4-Kernel. In Kerneln vor 2.6.20 ignorierten diese Aufrufe den Effekt des Schalters MS_NOEXEC, wenn dieser für das Einhängen (den Aufruf von mount(2)) für das zugrunde liegende Dateisystem verwendet wurde. Seit Kernel 2.6.20 wird MS_NOEXEC beachtet.

SIEHE AUCH
chmod(2), chown(2), open(2), setgid(2), setuid(2), stat(2), euidaccess(3), credentials(7), path_resolution(7), symlink(7)

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

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Elmar Jansen <ej@pumuckel.gun.de>, Martin Schulze <joey@infodrom.org>, 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>.