Provided by: manpages-de-dev_1.11-1_all 

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.
The check is done using the calling process's real UID and GID, rather than the effective IDs as is done
when actually attempting an operation (e.g., open(2)) on the file. Similarly, for the root user, the
check uses the set of permitted capabilities rather than the set of effective capabilities; and for
non-root users, the check uses an empty set of capabilities.
This allows set-user-ID programs and capability-endowed programs to easily determine the invoking user's
authority. In other words, access() does not answer the "can I read/write/execute this file?" question.
It answers a slightly different question: "(assuming I'm a setuid binary) can the user who invoked me
read/write/execute this file?", which gives set-user-ID programs the possibility to prevent malicious
users from causing them to read files which users shouldn't be able to read.
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 wird durch bitweises ODER aus null oder mehr der folgenden Werte konstruiert:
AT_EACCESS
Eine Zugriffsprüfung wird mittels der effektiven Benutzer- und Gruppen-IDs ausgeführt. In der
Voreinstellung verwendet faccessat() die realen IDs (wie access()).
AT_SYMLINK_NOFOLLOW
Falls Pfadname ein symbolischer Link ist, wird er nicht dereferenziert: stattdessen wird eine
Information zum Link selbst zurückgegeben.
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 Unzulässiger Schalter wurde in flags angegeben.
ENOTDIR
Pfadname ist relativ und dirfd ist ein Dateideskriptor, der sich auf eine Datei bezieht, die kein
Verzeichnis ist.
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
Warnung: Beispielsweise öffnet die Überprüfung mittels access(), ob ein Benutzer eine Datei öffnen darf,
bevor das tatsächlich mittels open(2) versucht wird, eine Sicherheitslücke, da der Benutzer das kurze
Zeitintervall zwischen der Überprüfung und dem Öffnen der Datei aus nutzen könnte, um die Datei zu
manipulieren. Darum sollte die Verwendung dieses Systemaufrufs vermieden werden. (Im gerade beschriebenen
Beispiel wäre eine sichere Alternative, vorübergehend die effektive Benutzer-ID des Prozesses auf die
reale Benutzer-ID zu setzen und danach open(2) aufzurufen.)
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.
Unterschiede C-Bibliothek/Kernel
Der reine faccessat()-Systemaufruf akzeptiert nur die ersten drei Argumente. Die Schalter AT_EACCESS und
AT_SYMLINK_NOFOLLOW sind eigentlich in der Glibc-Wrapper-Funktion für faccessat() implementiert. Falls
einer dieser Schalter angegeben ist, dann nutzt die Wrapper-Funktion fstatat, um die Zugriffsrechte zu
ermitteln.
Anmerkungen zur Glibc
Wenn in älteren Kerneln faccessat() nicht verfügbar sind und die Schalter AT_EACCESS und
AT_SYMLINK_NOFOLLOW nicht angegeben sind, dann weicht die Glibc-Wrapper-Funktion auf access() aus. Wenn
Pfadname ein relativer Pfadname ist, konstruiert die Glibc einen Pfadnamen, der auf dem symbolischen Link
in /proc/self/fd basiert, der dem dirfd-Argument entspricht.
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 der Schalter 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
Diese Seite ist Teil der Veröffentlichung 4.04 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 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>.
Linux 23. Juli 2015 ACCESS(2)