Scroll to navigation

ACCESS(2) Linux - Příručka programátora ACCESS(2)

JMÉNO

access - kontroluje přístupová práva k souboru

SYNTAXE

#include <unistd.h>

int access(const char *pathname, int mode);

POPIS

access() kontroluje, zda proces může číst či zapisovat do souboru (nebo jiného objektu souborového systému) se jménem pathname. Lze jej také použít ke zjištění existence pathname. Pokud je pathname symbolický odkaz, pak jsou testována přístupová práva souboru, na který odkaz směřuje.

mode je maska obsahující jednu či více těchto možností: R_OK, W_OK, X_OK a F_OK.

R_OK, W_OK a X_OK provede testování, zda soubor existuje a má pro běžící proces nastavená práva ke čtení (Read), psaní (Write) a vykonání (eXecute). F_OK kontroluje pouze existenci souboru.

Výsledek testu závisí na přístupových právech adresářů, jež náleží cestě k souboru pathname, a na přístupových právech adresářů a souborů, na které směřují symbolické odkazy na cestě.

Kontrola je provedena se skutečným uid a gid procesu. Nebere se zřetel na efektivní id, které se projeví při souborové operaci. Tak mohou setuid programy snadno zjistit skutečná práva uživatele.

Pokud má volající proces dostatečná privilegia (například skutečné UID je nula), pak je test X_OK pro soubor úspěšný, pokud je povoleno spouštění souboru jeho vlastníkem skupinou nebo ostatními.

NÁVRATOVÁ HODNOTA

Při úspěchu (všechna kontrolovaná práva jsou dostupná) vrací nulu. Při neúspěchu (alespoň jeden druh přístupu reprezentovaný příslušným bitem z mode je odepřen, nebo nastane jiná chyba), vrací -1, a proměnná errno je nastavena.

CHYBOVÉ STAVY

access() by měl selhat pokud:

Přístup k požadovanému souboru by byl odepřen nebo právo na vyhledávání je odepřeno pro některý z adresářů v cestě pathname. (Viz také path_resolution(7).)
pathname obsahuje cyklický symbolický odkaz, např. symbolický odkaz odkazuje sám na sebe.
pathname je příliš dlouhý.
Adresáře v pathname by mohly být přístupné, ale neexistují, nebo jsou to volné symbolické odkazy.
Části pathname použité jako adresáře ve skutečnosti nejsou adresáře
Bylo požadováné právo zápisu pro soubor, ale souborový systém je pouze pro čtení.

access() může selhat pokud:

pathname odkazuje někam mimo přístupný adresovatelný diskový prostor.
mode je zadán chybně.
Objevila se vstup výstupní chyba.
Málo paměti jádra.
Bylo požadováno právo zápisu na spustitelný soubor, který je právě spuštěn.

POZNÁMKY

Varování: Použití funkce access pro kontrolu zda je uživatel schopen například otevřít soubor, před tím, než tak opravdu učiníme, je bezpečnostní problém, protože je možné využít relativně krátkého časového okamžiku mezi kontrolou a otevřením souboru k manipulaci s ním. Proto by jste se měli vyvarovat použití tohoto systémového volání pro tento účel.

Funkce access vrací chybu, je-li libovolný z přístupových typů specifikovaných v mode odmítnut, i když jsou některé jiné přijaty.

Pokud má volající proces dostatečné privilegia (například super uživatel), pak norma POSIX.1-2001 povoluje implementaci, která indikuje úspěch pro kontrolu X_OK i když není nastavený žádný z bitů, které povolují spouštění souboru. Linux toto nepovoluje.

Soubor je přístupný pouze pokud je povoleno prohledávání všech adresářů, které se nacházejí v prefixu cesty k souboru (pathname). Pokud je libovolný z těchto adresářů nedostupný, pak volání access() skončí neúspěchem, nezáleží na tom, zda máme právo přistupovat k souboru samotnému.

Jsou kontrolovány pouze bity, které určují přístup k souboru nikoli typ souboru nebo jeho obsah. Takže pokud je možný zápis do adresáře, pak to pravděpodobně znamená, že mohou být uvnitř tohoto adresáře vytvářeny soubory, a ne že lze adresář zapisovat jako soubor. Podobně může být DOS soubor shledán zapisovatelným, ale volání execve(2) skončí chybovou hláškou.

Volání access() nemusí korektně fungovat na NFS souborových systémech, které mají povolené UID mapování, protože UID mapování se provádí na straně serveru a je skryté před klientem, který kontroluje práva.

CHYBY

Ve verzích kernelu 2.4 a starších jsou problemy v testu na X_OK pro super uživatele. Pokud jsou práva pro spouštění zakázána pro všechny uživatele a jedná se o soubor, ne adresář, pak tento test vrátí -1, pouze pokud je mode specifikován jako X_OK. Pokud je v mode specifikováno i R_OK nebo W_OK pak access() vrací pro takovéto soubory 0. Verze kernelu 2.6 (až do verze 2.6.3 včetně) se chovaly stejně jako kernel 2.4.

V kernelech před verzí 2.6.20 ignorovala funkce access() efekt flagu MS_NOEXEC pokud byl tento příznak použit pro přípojení (mount(2)) souborového podsystému. Od verze 2.6.20 již funkce access() bere tento příznak v potaz.

DALŠÍ INFORMACE

chmod(2), chown(2), facestat(2), open(2), setgid(2), setuid(2), stat (2), euidaccess (3), credentials(7), path_resolution(7)

VAROVÁNÍ

Tato stránka je součástí projektu Linux man-pages ve verzi 3.19. Popis projektu a informace o oznamování chyb je možno nalézt na http://www.kernel.org/doc/man-pages/.

23. lisotpadu 2009 Linux 1.2.13