> Linux Reviews > man >

access


  1. access.2.man


1. access.2.man

Manpage of ACCESS

ACCESS

Section: Руководство программиста Linux (2)
Updated: 2007-07-10
Index Return to Main Contents
 

ИМЯ

access - проверить реальные права доступа пользователя к файлу  

ОБЗОР

#include <unistd.h>

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

ОПИСАНИЕ

access проверяет, имеет ли вызвавший процесс права доступа к файлу pathname. Если pathname является символьной ссылкой, то проверяются права доступа к файлу, на который она ссылается.

Аргумент mode --- это маска выполняемых проверок доступа; может быть равна значению F_OK, или состоять из одного или несколько побитово сложенных R_OK, W_OK и X_OK. F_OK проверяет существование файла. R_OK, W_OK и X_OK запрашивают проверку, соответственно, существования файла и возможности его чтения, записи или выполнения.

Проверка осуществляется с использованием реального, а не эффективного идентификатора пользователя (UID) и группы (GID) вызвавшего процесса. Эффективные идентификаторы будут использоваться при действительной попытке выполнения той или иной операции с файлом (например, open(2)). Это дает программам с set-user-ID простой способ проверить права доступа вызвавшего пользователя.

Если вызвавший процесс имеет соответствующие привилегии (например, его реальный UID равен нулю), то проверка X_OK пройдёт успешно для обычного файла, если у него установлено право на выполнение в любой группе бит: у владельца, группы или остальных.  

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

В случае успеха (есть все запрошенные права) возвращается нуль. При ошибке (по крайней мере, одно право из mode было не удовлетворено, или случилась другая ошибка), возвращается -1, а errno устанавливается должным образом.  

ОШИБКИ

access() будет завершаться с ошибкой если:
EACCES
Запрошенный тип доступа не удовлетворён или в одном из каталогов в pathname не разрешён поиск. (См. также path_resolution(7).)
ELOOP
Во время определения pathname встретилось слишком много символьных ссылок.
ENAMETOOLONG
Слишком длинное значение аргумента pathname.
ENOENT
Компонент пути pathname не существует или является повисшей символьной ссылкой.
ENOTDIR
Компонент пути, использованный как каталог в pathname, в действительности таковым не является.
EROFS
Запрошены права для файла, который находится на файловой системе, смонтированной только для чтения.

access() может завершиться с ошибкой, если:

EFAULT
Аргумент pathname указывает за пределы доступного адресного пространства.
EINVAL
Аргумент mode был задан неверно.
EIO
Произошла ошибка ввода-вывода.
ENOMEM
Недостаточное количество памяти ядра.
ETXTBSY
Запрошены права на запись для исполняемого файла, который сейчас выполняется.
 

СООТВЕТСТВИЕ СТАНДАРТАМ

SVr4, 4.3BSD, POSIX.1-2001.  

ЗАМЕЧАНИЯ

Предупреждение: Использование access() для проверки, например, разрешено ли пользователю открытие файла перед реальным выполнением open(2), создаёт брешь в безопасности, так как пользователь может использовать короткий промежуток времени между проверкой и открытием файла для управления им. По этой причине лучше избегать использования данного системного вызова.

access() возвращает ошибку, если отказано в любом из типов доступа mode, даже если разрешены остальные типы.

Если вызвавший процесс имеет соответствующие привилегии (например, суперпользователя), то POSIX.1-2001 разрешает реализации вернуть успех при проверке X_OK даже, если ни один из битов выполнения файла не установлен. В Linux так не происходит.

Файл доступен только в случае, если для каждого каталога в пути, указанном в pathname, имеется право выполнять поиск (то есть, установлен бит выполнения). Если какой-то каталог недоступен, то вызов access() вернёт ошибку, независимо от имеющихся прав файла.

Проверяются только биты доступа, но не тип файла или его содержимое. Поэтому, если обнаруживается, что в каталог можно писать, то это, вероятно, означает, что в этом каталоге можно создавать файлы, и что в этот каталог нельзя писать как в файл. Также, файл DOS может быть посчитан как "исполняемый", но вызов execve(2) всё-равно не сможет его запустить.

Вызов access() может некорректно работать на файловых системах NFS со включенным преобразованием UID-ов, потому что это преобразование происходит на сервере и спрятано от клиента, который пытается проверить права.  

ДЕФЕКТЫ

В ядрах версии 2.4 (и более ранних) есть некоторая странность в работе теста X_OK для суперпользователя. Если для всех категорий право исполнения отключено для файла-не каталога, то тест access() возвращает -1 только когда mode задан как X_OK; если в mode также указан флаг R_OK или W_OK, то access() вернёт для таких файлов 0. Ранние версии ядер 2.6 (до 2.6.3 включительно) ведут себя также как ядра 2.4.

В ядрах до версии 2.6.20 вызов access() игнорировал влияние флаг MS_NOEXEC, если он был установлен с помощью mount(2) в содержащей файл файловой системе. Начиная с версия ядра 2.6.20, access() учитывает этот флаг.  

СМОТРИТЕ ТАКЖЕ

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


 

Index

ИМЯ
ОБЗОР
ОПИСАНИЕ
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
ОШИБКИ
СООТВЕТСТВИЕ СТАНДАРТАМ
ЗАМЕЧАНИЯ
ДЕФЕКТЫ
СМОТРИТЕ ТАКЖЕ

This document was created by man2html using the manual pages.
Time: 17:41:08 GMT, October 23, 2013

SVENSKA - cs - SVENSKA - SVENSKA - SVENSKA - ja - nl - pl