Provided by: manpages-ru-dev_4.18.1-1_all bug

ИМЯ

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

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <unistd.h>

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

       #include <fcntl.h>            /* определения констант AT_* */
       #include <unistd.h>

       int faccessat(int dirfd, const char *pathname, int mode, int flags);
                       /* But see C library/kernel differences, below */

       #include <fcntl.h>            /* определения констант AT_* */
       #include <sys/syscall.h>      /* определения констант SYS_* */
       #include <unistd.h>

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

   Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

       faccessat():
           Since glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Before glibc 2.10:
               _ATFILE_SOURCE

ОПИСАНИЕ

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

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

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

       Это  дает программам с set-user-ID или снабжённых мандатами простой способ проверить права
       доступа вызвавшего пользователя. Другими словами, access() не отвечает на вопрос  «могу  я
       прочитать/записать/выполнить   этот   файл?».   Он  отвечает  на  немного  другой  вопрос:
       «(предположим я исполняемый  файл  с  setuid)  может  ли  пользователь,  запустивший  меня
       прочитать/записать/выполнить этот файл?», что даёт программам с set-user-ID возможность не
       дать злонамеренным пользователям прочитать файлы, которые пользователи не должны читать.

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

   faccessat()
       faccessat() работает также как системный вызов access(), за исключением случаев, описанных
       здесь.

       Если  в  pathname  задан  относительный  путь,  то  он считается относительно каталога, на
       который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего  каталога
       вызывающего процесса, как это делается в access()).

       Если  в pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD, то
       pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как
       access()).

       Если в pathname задан абсолютный путь, то dirfd игнорируется.

       Значение flags составляется из побитово сложенных следующих значений:

       AT_EACCESS
              Выполнять  проверку,  доступа  используя  эффективный  идентификатор пользователя и
              группы. По умолчанию в faccessat()  используются  реальные  идентификаторы  (как  в
              access()).

       AT_SYMLINK_NOFOLLOW
              Если  значение pathname является символьной ссылкой, не разыменовывать её, а выдать
              информацию о самой ссылке.

       Смотрите в openat(2) объяснение необходимости faccessat().

   faccessat2()
       The  description  of  faccessat()   given  above  corresponds  to  POSIX.1  and   to   the
       implementation  provided  by  glibc.   However,  the glibc implementation was an imperfect
       emulation (see BUGS)  that papered over the fact that the raw  Linux  faccessat()   system
       call  does  not  have  a  flags argument.  To allow for a proper implementation, Linux 5.8
       added the faccessat2() system call, which supports the flags argument and allows a correct
       implementation of the faccessat()  wrapper function.

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

       On  success (all requested permissions granted, or mode is F_OK and the file exists), zero
       is returned.  On error (at least one bit in mode asked for a permission that is denied, or
       mode  is  F_OK and the file does not exist, or some other error occurred), -1 is returned,
       and errno is set to indicate the error.

ОШИБКИ

       EACCES Запрошенный тип доступа не удовлетворён или в одном  из  каталогов  в  pathname  не
              разрешён поиск. (См. также path_resolution(7).)

       EBADF  (faccessat())   pathname  is  relative  but dirfd is neither AT_FDCWD (faccessat())
              nor a valid file descriptor.

       EFAULT Аргумент pathname указывает за пределы доступного адресного пространства.

       EINVAL Аргумент mode был задан неверно.

       EINVAL (faccessat())  Указано неверное значение в flags.

       EIO    Произошла ошибка ввода-вывода.

       ELOOP  Во время определения pathname встретилось слишком много символьных ссылок.

       ENAMETOOLONG
              Слишком длинное значение аргумента pathname.

       ENOENT Компонент пути pathname не существует или является повисшей символьной ссылкой.

       ENOMEM Недостаточное количество памяти ядра.

       ENOTDIR
              Компонент пути, использованный как каталог в pathname, в  действительности  таковым
              не является.

       ENOTDIR
              (faccessat())   Значение  pathname  содержит  относительный  путь  и dirfd содержит
              файловый дескриптор, указывающий на файл, а не на каталог.

       EPERM  Write permission was requested to a file that has the immutable flag set.  See also
              ioctl_iflags(2).

       EROFS  Запрошено  право  на  запись  в  файл,  расположенный в файловой системе, доступной
              только для чтения.

       ETXTBSY
              Запрошены права на запись для исполняемого файла, который сейчас выполняется.

ВЕРСИИ

       faccessat()  was added in Linux 2.6.16; library support was added in glibc 2.4.

       faccessat2()  was added in Linux 5.8.

СТАНДАРТЫ

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

       faccessat(): POSIX.1-2008.

       faccessat2(): Linux-specific.

ЗАМЕЧАНИЯ

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

       Вызов access() всегда разыменовывает символьные ссылки. Если  вам  нужно  проверить  права
       символьной ссылки, используйте вызов faccessat() с флагом AT_SYMLINK_NOFOLLOW.

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

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

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

       Only access bits are checked, not the file type or contents.  Therefore, if a directory is
       found  to  be  writable, it probably means that files can be created in the directory, and
       not that the directory can be written as a file.  Similarly, a DOS file may be reported as
       executable, but the execve(2)  call will still fail.

       Эти  вызовы  access()  могут некорректно работать на файловых системах NFSv2 со включённым
       преобразованием UID-ов, потому что это преобразование происходит на сервере и спрятано  от
       клиента,  который  пытается проверить права (в NFS версии 3 и выше выполняется проверка на
       сервере). Похожие проблемы могут возникать при монтировании FUSE.

   Отличия между библиотекой C и ядром
       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, but see BUGS.

   Замечания по glibc
       В  старых  ядрах,  где  faccessat()  отсутствует  (и  если  не  указаны флаги AT_EACCESS и
       AT_SYMLINK_NOFOLLOW), обёрточная функция glibc использует access(). Если pathname является
       относительным   путём,   то  glibc  собирает  путь  относительно  символической  ссылки  в
       /proc/self/fd, которая соответствует аргументу dirfd.

ДЕФЕКТЫ

       Because the Linux kernel's faccessat()  system call does not support a flags argument, the
       glibc  faccessat()   wrapper  function  provided  in  glibc  2.32 and earlier emulates the
       required functionality using a combination of the faccessat()  system call and fstatat(2).
       However,  this  emulation  does not take ACLs into account.  Starting with glibc 2.33, the
       wrapper function avoids this bug by making use of the faccessat2() system call where it is
       provided by the underlying kernel.

       In  Linux  2.4  (and  earlier) there is some strangeness in the handling of X_OK tests for
       superuser.  If all categories of execute permission are disabled for a nondirectory  file,
       then  the  only  access()  test that returns -1 is when mode is specified as just X_OK; if
       R_OK or W_OK is also specified in mode, then access()  returns 0 for  such  files.   Early
       Linux 2.6 (up to and including Linux 2.6.3)  also behaved in the same way as Linux 2.4.

       Before  Linux  2.6.20, these calls ignored the effect of the MS_NOEXEC flag if it was used
       to mount(2)  the underlying  filesystem.   Since  Linux  2.6.20,  the  MS_NOEXEC  flag  is
       honored.

СМ. ТАКЖЕ

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

ПЕРЕВОД

       Русский   перевод   этой   страницы   руководства   был   сделан    Dmitry    Bolkhovskikh
       <d20052005@yandex.ru> и Yuri Kozlov <yuray@komyakino.ru>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.