access(2) System Calls Manual access(2) BEZEICHNUNG access, faccessat, faccessat2 - pruft die Zugriffsrechte des Benutzers an einer Datei BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int access(const char *Pfadname, int Modus); #include /* Definition der AT_*-Konstanten */ #include int faccessat(int Verzdd, const char *Pfadname, int Modus, int Schalter); /* Siehe aber auch C-Bibliothek/Kernel-Unterschiede, unten */ #include /* Definition der AT_*-Konstanten */ #include /* Definition der SYS_*-Konstanten */ #include int syscall(SYS_faccessat2, int Verzdd, const char *Pfadname, int Modus, int Schalter); Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)): faccessat(): Seit Glibc 2.10: _POSIX_C_SOURCE >= 200809L Vor Glibc 2.10: _ATFILE_SOURCE BESCHREIBUNG access() pruft, ob der Prozess auf die Datei Pfadname zugreifen kann. Falls Pfadname ein symbolischer Link ist, werden die Zugriffsrechte der referenzierten Datei gepruft. Modus gibt an, welche Zugriffsprufungen durchgefuhrt 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 uberpruft, ob die Datei existiert. R_OK, W_OK und X_OK uberprufen, ob die Datei existiert und entsprechend Lese-, Schreib- und Ausfuhrungsrechte gewahrt. Diese Prufung wird mit der realen UID und der realen GID des Prozesses durchgefuhrt und nicht mit den effektiven Kennungen, wie das beim tatsachlichen Versuch, eine Operation auszufuhren, der Fall ist (z.B. mit open(2) auf eine Datei zugreifen). Ahnlich verwendet die Prufung fur den Benutzer >>root<< die Menge der erlaubten Capabilities statt die Menge der effektiven Capabilities und fur nicht-root-Benutzer verwendet die Prufung die leere Menge an Capabilities. Dadurch konnen >>set-UID<<-Programme und Programme, die mit Capabilities ausgestattet sind, leicht die Berechtigungen des Aufrufenden feststellen. Mit anderen Worten, access() beantwortet nicht die Frage: >>Kann ich diese Datei lesen/schreiben/ausfuhren?<<. Es beantwortet eine etwas andere Frage: >>Unter der Annahme, dass ich ein >setuid<-Programm bin: Kann der Benutzer, der mich aufrief, diese Datei lesen/schreiben/ausfuhren?<<. Dies ermoglicht >>set-user-ID<<-Programmen, bosartige Benutzer davon abzuhalten, Dateien zu lesen, die sie nicht lesen konnen sollten. Falls der aufrufende Prozess privilegiert ist (d. h., seine reale UID ist null), wird eine X_OK-Prufung fur eine regulare Datei erfolgreich sein, wenn Ausfuhrungsrechte fur Eigentumer, Gruppe oder Andere gegeben sind. faccessat() faccessat() funktioniert genauso wie access(), ausser mit den hier beschriebenen Unterschieden. Falls der in Pfadname ubergebene Pfadname relativ ist, wird er als relativ zu dem vom Dateideskriptor Verzdd referenzierten Verzeichnis interpretiert (statt relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses, wie es bei access() fur einen relativen Pfadnamen erfolgt). Falls Pfadname relativ ist und Verzdd den speziellen Wert AT_FDCWD annimmt, wird Pfadname als relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses interpretiert (wie access()). Falls Pfadname absolut ist, wird Verzdd ignoriert. Schalter wird durch bitweises ODER aus null oder mehr der folgenden Werte konstruiert: AT_EACCESS Eine Zugriffsprufung wird mittels der effektiven Benutzer- und Gruppenkennungen ausgefuhrt. In der Voreinstellung verwendet faccessat() die realen Kennungen (wie access()). AT_EMPTY_PATH (seit Linux 5.8) Falls Pfadname eine leere Zeichenkette ist, wird auf der durch Verzdd referenzierten Datei gearbeitet (die mittels des Schalters O_PATH von open(2) erlangt worden sein kann). In diesem Fall kann sich Verzdd auf jeden Dateityp beziehen, nicht nur ein Verzeichnis. Falls Verzdd AT_FDCWD ist, agiert der Aufruf auf dem aktuellen Arbeitsverzeichnis. Dieser Schalter ist Linux-spezifisch; definieren Sie _GNU_SOURCE, um seine Definition zu erlangen. AT_SYMLINK_NOFOLLOW Falls Pfadname ein symbolischer Link ist, wird er nicht dereferenziert: stattdessen wird eine Information zum Link selbst zuruckgegeben. Lesen Sie openat(2) fur eine Beschreibung der Notwendigkeit von faccessat(). faccessat2() Die oben dargestellte Beschreibung von faccessat() entspricht POSIX.1 und der von Glibc bereitgestellten Implementierung. Allerdings war die Glibc-Implementierung eine nicht perfekte Nachbildung (siehe FEHLER), die die Tatsache kaschierte, dass der rohe Linux-Systemaufruf faccessat() uber kein Argument Schalter verfugt. Um eine korrekte Implementierung zu erlauben, fugte Linux 5.8 den Systemaufruf faccessat2() hinzu, der das Argument Schalter unterstutzt und eine korrekte Implementierung der Wrapper-Funktion faccessat() erlaubt. RUCKGABEWERT Bei Erfolg (alle abgefragten Zugriffsrechte sind gegeben oder Modus ist F_OK und die Datei existiert) wird Null zuruckgegeben. Bei einem Fehler (mindestens eine in Modus abgefragte Zugriffsart fehlt oder Modus ist F_OK und die Datei existiert nicht oder ein anderer Fehler trat auf) wird -1 zuruckgegeben und errno gesetzt, um den Fehler anzuzeigen. FEHLER EACCES Die abgefragte Zugriffsart auf die Datei wurde verwehrt oder das Suchen wird in einem der Verzeichnisse des Pfadprafixes von Pfadname verweigert (siehe auch path_resolution(7)). EBADF (faccessat()) Der Pfadname ist relativ, aber Verzdd ist weder AT_FDCWD (faccessat()) noch ein gultiger Dateideskriptor. EFAULT Pfadname zeigt aus dem fur Sie zuganglichen Adressraum heraus. EINVAL Modus wurde falsch angegeben. EINVAL (faccessat()) Unzulassiger Schalter in Schalter angegeben. EIO Es ist ein E/A-Fehler (engl. I/O) aufgetreten. ELOOP Bei der Auflosung von Pfadname wurden zu viele symbolische Links gefunden. ENAMETOOLONG Pfadname ist zu lang. ENOENT Eine Komponente von Pfadname existiert nicht oder ist ein toter symbolischer Link. ENOMEM Es war nicht genugend Kernelspeicher verfugbar. ENOTDIR Eine als Verzeichnis benutzte Komponente von Pfadname ist kein Verzeichnis. ENOTDIR (faccessat()) Pfadname ist relativ und Verzdd ist ein Dateideskriptor, der sich auf eine Datei bezieht, die kein Verzeichnis ist. EPERM Es wurde Schreibberechtigung fur eine Datei abgefragt, die den Schalter unveranderlich (>>immutable<<) gesetzt hat. Siehe auch ioctl_iflags(2). EROFS Es wurde Schreibberechtigung fur eine Datei auf einem nur lesbaren Dateisystem abgefragt. ETXTBSY Es wurde Schreibzugriff fur ein ausfuhrbares Programm abgefragt, das gerade ausgefuhrt wird. VERSIONEN Falls der aufrufende Prozess uber entsprechende Privilegien verfugt (d. h. Superuser ist), gestattet POSIX.1-2001 einer Implementierung, fur eine X_OK-Prufung Erfolg zu melden, auch wenn keines der Datei-Ausfuhrungsbits gesetzt ist. Linux tut das nicht. 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 fur faccessat() implementiert. Falls einer dieser Schalter angegeben ist, dann nutzt die Wrapper-Funktion fstatat(2), um die Zugriffsrechte zu ermitteln; siehe aber auch FEHLER. Anmerkungen zur Glibc Wenn in alteren Kerneln faccessat() nicht verfugbar 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 Verzdd-Argument entspricht. STANDARDS access() faccessat() POSIX.1-2008. faccessat2() Linux. GESCHICHTE access() SVr4, 4.3BSD, POSIX.1-2001. faccessat() Linux 2.6.16, Glibc 2.4. faccessat2() Linux 5.8. ANMERKUNGEN Warnung: Werden diese Aufrufe dazu verwandt, mittels open(2) zu prufen, ob einem Benutzer beispielsweise erlaubt ist, eine Datei zu offnen, bevor dies tatsachlich erfolgt, fuhrt dies zu einem Sicherheitsloch. Der Benutzer konnte diesen kurzen Zeitraum zwischen der Uberprufung und dem Offnen der Datei benutzen, um sie zu verandern. Darum sollte die Verwendung dieses Systemaufrufs vermieden werden. (Im gerade beschriebenen Beispiel ware eine sicherere Alternative, vorubergehend die effektive Benutzerkennung des Prozesses auf die reale Benutzerkennung zu setzen und dann open(2) aufzurufen.) access() lost immer symbolische Links auf. Wenn Sie Rechte eines symbolischen Links prufen mussen, verwenden Sie faccessat() mit dem Schalter AT_SYMLINK_NOFOLLOW. Diese Aufrufe geben einen Fehler zuruck, wenn irgendeine der Zugriffsarten in Modus verwehrt wird, sogar wenn einige der anderen Zugriffsarten in Modus gestattet sind. Auf eine Datei kann nur zugegriffen werden, wenn jedes der Verzeichnisse im Pfadprafix von Pfadname suchenden (d. h. ausfuhrenden) Zugriff zulasst. Wenn auf irgendein Verzeichnis nicht zugegriffen werden kann, schlagt unabhangig von den Zugriffsrechten fur die Datei selbst der Aufruf von access() fehl. Nur die Zugriffs-Bits werden gepruft, nicht der Dateityp oder -inhalt. Deshalb bedeutet ein als beschreibbar erkanntes Verzeichnis wahrscheinlich, dass in ihm Dateien erstellt werden konnen und nicht, dass das Verzeichnis als Datei geschrieben werden kann. Ebenso kann eine DOS-Datei als ausfuhrbar gemeldet werden, aber ein Aufruf von execve(2) kann immer noch fehlschlagen. Diese Aufrufe arbeiten wahrscheinlich nicht korrekt mit NFS-Dateisystemen, fur die UID-Mapping aktiviert ist, weil das UID-Mapping auf dem Server erfolgt und dem Client, der die Berechtigungen pruft, verborgen bleibt (NFS-Versionen ab 3 fuhren die Uberprufung auf dem Server aus). Ahnliche Probleme konnen mit FUSE-Einhangungen auftreten. FEHLER Da der Linux-Kernel-Systemaufruf faccessat() das Argument Schalter nicht unterstutzt, stellte die Glibc-Wrapperfunktion faccessat() in Glibc 2.32 und alter eine Nachahmung bereit, die ACLs nicht berucksichtigt. Beginnend mit Glibc 2.33, vermeidet die Wrapper-Funktion diesen Fehler, indem sie den Systemaufruf faccessat2() verwendet, sofern er vom zugrundeliegenden Kernel unterstutzt wird. In Linux 2.4 (und fruher) ist das Verhalten bei der Handhabung von X_OK-Prufungen fur Superuser etwas seltsam. Falls alle Kategorien der Ausfuhrungsberechtigung fur eine Datei, die kein Verzeichnis ist, deaktiviert sind, gibt nur die Zugriffsprufung -1 zuruck, fur die Modus lediglich als X_OK angegeben ist; falls auch R_OK oder W_OK in Modus angegeben ist, gibt access() fur solche Dateien 0 zuruck. Fruhe 2.6er Linuxe (bis einschliesslich Linux 2.6.3) verhielten sich in der gleichen Weise wie 2.4er Linuxe. Vor Linux 2.6.20 ignorierten diese Aufrufe den Effekt des Schalters MS_NOEXEC, wenn dieser fur das Einhangen (den Aufruf von mount(2)) fur das zugrunde liegende Dateisystem verwendet wurde. Seit Linux 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) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Elmar Jansen , Martin Schulze , Martin Eberhard Schauer , Mario Blattermann , Helge Kreutzmann und Dr. Tobias Quathamer erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 1. Januar 2024 access(2)