.\" -*- coding: UTF-8 -*- .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH access 2 "17 мая 2025 г." "Справочные страницы Linux 6.15" .SH НАИМЕНОВАНИЕ access, faccessat, faccessat2 \- проверка прав доступа пользователя к файлу .SH БИБЛИОТЕКА Стандартная библиотека языка C (\fIlibc\fP,\ \fI\-lc\fP) .SH ОБЗОР .nf \fB#include \fP .P \fBint access(const char *\fP\fIpath\fP\fB, int \fP\fImode\fP\fB);\fP .P \fB#include \fP /* определения констант \fBAT_*\fP */ \fB#include \fP .P \fBint faccessat(int \fP\fIdirfd\fP\fB, const char *\fP\fIpath\fP\fB, int \fP\fImode\fP\fB, int \fP\fIflags\fP\fB);\fP /* But see C library/kernel differences, below */ .P \fB#include \fP /* определения констант \fBAT_*\fP */ \fB#include \fP /* определения констант \fBSYS_*\fP */ \fB#include \fP .P \fBint syscall(SYS_faccessat2,\fP \fB int \fP\fIdirfd\fP\fB, const char *\fP\fIpath\fP\fB, int \fP\fImode\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .P .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .P \fBfaccessat\fP(): .nf Начиная с glibc 2.10: _POSIX_C_SOURCE >= 200809L До glibc 2.10: _ATFILE_SOURCE .fi .SH ОПИСАНИЕ \fBaccess\fP() checks whether the calling process can access the file \fIpath\fP. If \fIpath\fP is a symbolic link, it is dereferenced. .P .\" F_OK is defined as 0 on every system that I know of. Аргумент \fImode\fP \- маска выполняемых проверок доступа; может быть равна значению \fBF_OK\fP, или состоять из результатов одной или нескольких поразрядных операций логическое ИЛИ с операндами \fBR_OK\fP, \fBW_OK\fP и \fBX_OK\fP. \fBF_OK\fP проверяет существование файла. \fBR_OK\fP, \fBW_OK\fP и \fBX_OK\fP запрашивают проверку, соответственно, существования файла и возможности его чтения, записи или выполнения. .P Проверка осуществляется с использованием \fIreal\fP (действительного), а не эффективного (текущего) идентификатора пользователя (UID) и группы (GID) вызвавших процесс. Эффективные идентификаторы будут использоваться при действительной попытке выполнения той или иной операции с файлом (например, \fBopen\fP(2)). Аналогичным образом, для пользователя root, при проверке используется набор прав доступа, а не набор эффективных прав доступа; для не root\-пользователей при проверке используется пустой набор прав доступа. .P Это позволяет программам с set\-user\-ID (setuid) и программам с расширенными возможностями легко определять права доступа вызывавшего их пользователя. Другими словами программа \fBaccess\fP() не отвечает на запрос «может она прочитать/записать/выполнить этот файл?». Она отвечает на несколько иной запрос (в предположении, что это двоичный файл с setuid) : « может ли \fIthe user who invoked me\fP (может ли пользователь, запустивший этот файл) прочитать/записать/выполнить этот файл?». Это даёт возможность программам с set\-user\-ID не дать злонамеренным пользователям прочитать файлы, которые они не имеют права прочитать. .P Если вызвавший процесс имеет соответствующие привилегии (например, его реальный UID равен 0), то проверка \fBX_OK\fP пройдёт успешно для обычного файла, если у него установлено право на выполнение для любых владельце, групп или остальных. .SS faccessat() \fBfaccessat\fP() действует точно так же, как \fBaccess\fP(), за исключением случаев, описанных здесь. .P If \fIpath\fP is relative, then it is interpreted relative to the directory referred to by the file descriptor \fIdirfd\fP (rather than relative to the current working directory of the calling process, as is done by \fBaccess\fP() for a relative pathname). .P If \fIpath\fP is relative and \fIdirfd\fP is the special value \fBAT_FDCWD\fP, then \fIpath\fP is interpreted relative to the current working directory of the calling process (like \fBaccess\fP()). .P If \fIpath\fP is absolute, then \fIdirfd\fP is ignored. .P Значение \fIflags\fP получается с помощью операции логическое ИЛИ с нулём или со следующими значениями: .TP \fBAT_EACCESS\fP Выполнять проверку, доступа используя эффективный идентификатор пользователя и группы. По умолчанию в \fBfaccessat\fP() используются реальные идентификаторы (как в \fBaccess\fP()). .TP \fBAT_EMPTY_PATH\fP (начиная с Linux 5.8) If \fIpath\fP is an empty string, operate on the file referred to by \fIdirfd\fP (which may have been obtained using the \fBopen\fP(2) \fBO_PATH\fP flag). In this case, \fIdirfd\fP can refer to any type of file, not just a directory. If \fIdirfd\fP is \fBAT_FDCWD\fP, the call operates on the current working directory. This flag is Linux\-specific; define \fB_GNU_SOURCE\fP to obtain its definition. .TP \fBAT_SYMLINK_NOFOLLOW\fP If \fIpath\fP is a symbolic link, do not dereference it: instead return information about the link itself. .P .\" Смотрите в \fBopenat\fP(2) объяснение необходимости \fBfaccessat\fP(). .SS faccessat2() Приведенное выше описание функции \fBfaccessat\fP() соответствует POSIX.1 и реализации, предоставленной glibc. Однако реализация glibc была несовершенной эмуляцией (см. раздел "ОШИБКИ"), которая скрывала тот факт, что исходный системный вызов Linux \fBfaccessat\fP() не имеет аргумента \fIflags\fP. Чтобы обеспечить правильную реализацию, в Linux 5.8 был добавлен системный вызов \fBfaccessat2\fP(), который поддерживает аргумент \fIflags\fP и позволяет корректно реализовать функцию\-оболочку \fBfaccessat\fP(). .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" В случае успеха (все запрошенные разрешения предоставлены, или \fImode\fP это \- \fBF_OK\fP и файл существует), то возвращается ноль. При ошибке (по крайней мере, из\-за одного бита, в доступе \fImode\fP было отказано или \fImode\fP это \- \fBF_OK\fP и файл не существует, или произошла какая\-либо другая ошибка) возвращается значение \-1 и устанавливается \fIerrno\fP для указания на ошибку. .SH ОШИБКИ .TP \fBEACCES\fP The requested access would be denied to the file, or search permission is denied for one of the directories in the path prefix of \fIpath\fP. (See also \fBpath_resolution\fP(7).) .TP \fBEBADF\fP (\fBfaccessat\fP()) \fIpath\fP is relative but \fIdirfd\fP is neither \fBAT_FDCWD\fP (\fBfaccessat\fP()) nor a valid file descriptor. .TP \fBEFAULT\fP Аргумент \fIpath\fP указывает за пределы доступного адресного пространства. .TP \fBEINVAL\fP Аргумент \fImode\fP был задан неверно. .TP \fBEINVAL\fP (\fBfaccessat\fP()) Указано неверное значение в \fIflags\fP. .TP \fBEIO\fP Произошла ошибка ввода\-вывода. .TP \fBELOOP\fP Во время определения \fIpath\fP встретилось слишком много символьных ссылок. .TP \fBENAMETOOLONG\fP \fIpath\fP слишком длинен. .TP \fBENOENT\fP A component of \fIpath\fP does not exist or is a dangling symbolic link. .TP \fBENOMEM\fP Недостаточное количество памяти ядра. .TP \fBENOTDIR\fP A component used as a directory in \fIpath\fP is not, in fact, a directory. .TP \fBENOTDIR\fP (\fBfaccessat\fP()) \fIpath\fP is relative and \fIdirfd\fP is a file descriptor referring to a file other than a directory. .TP \fBEPERM\fP Было запрошено разрешение на запись в файл, для которого установлен флаг неизменяемости. Смотрите также \fBFS_IOC_SETFLAGS\fP(const). .TP \fBEROFS\fP Запрошено право на запись в файл, расположенный в файловой системе, доступной только для чтения. .TP \fBETXTBSY\fP Запрошены права на запись для исполняемого файла, который сейчас выполняется. .SH ВЕРСИИ .\" HPU-UX 11 and Tru64 5.1 do this. .\" Если вызывающий процесс имеет соответствующие права доступа (например, суперпользователя), то POSIX.1\-2001 позволяет реализации указывать на успешное выполнение проверки \fBX_OK\fP, даже если ни один из битов разрешения на выполнение файла не установлен. В Linux так не происходит. .SS "Отличия между библиотекой C и ядром" .\" Системный вызов raw \fBfaccessat\fP() принимает только первые три аргумента. Флаги \fBAT_EACCESS\fP и \fBAT_SYMLINK_NOFOLLOW\fP на самом деле реализованы в функции\-оболочке glibc для \fBfaccessat\fP(). Если указан любой из этих флагов, то функция\-оболочка использует \fBfstatat\fP(2) для определения прав доступа, но видит ОШИБКИ. .SS "Замечания по glibc" On older kernels where \fBfaccessat\fP() is unavailable (and when the \fBAT_EACCESS\fP and \fBAT_SYMLINK_NOFOLLOW\fP flags are not specified), the glibc wrapper function falls back to the use of \fBaccess\fP(). When \fIpath\fP is relative, glibc constructs a pathname based on the symbolic link in \fI/proc/self/fd\fP that corresponds to the \fIdirfd\fP argument. .SH СТАНДАРТЫ .TP \fBaccess\fP() .TQ \fBfaccessat\fP() POSIX.1\-2008. .TP \fBfaccessat2\fP() Linux. .SH ИСТОРИЯ .TP \fBaccess\fP() SVr4, 4.3BSD, POSIX.1\-2001. .TP \fBfaccessat\fP() Linux 2.6.16, glibc 2.4. .TP \fBfaccessat2\fP() Linux 5.8. .SH ПРИМЕЧАНИЯ \fBWarning \fP (предупреждение): Использование этих вызовов для проверки, например, разрешено ли пользователю открытие файла перед действительным выполнением \fBopen\fP(2), создаёт брешь в безопасности, так как пользователь может использовать короткий промежуток времени между проверкой и открытием файла для управления им. \fBПо этой причине лучше избегать использования данного системного вызова\fP (в только что описанном примере, безопасной альтернативой будет временное переключение эффективного пользовательского идентификатора процесса на действительный идентификатор и вызов \fBopen\fP(2)). .P Вызов \fBaccess\fP() всегда разыменовывает символьные ссылки. Если вам нужно проверить права символьной ссылки, используйте вызов \fBfaccessat\fP() с флагом \fBAT_SYMLINK_NOFOLLOW\fP. .P Эти вызовы возвращают ошибку, если отказано в любом из типов доступа \fImode\fP, даже если разрешены остальные типы. .P A file is accessible only if the permissions on each of the directories in the path prefix of \fIpath\fP grant search (i.e., execute) access. If any directory is inaccessible, then the \fBaccess\fP() call fails, regardless of the permissions on the file itself. .P Проверяются только биты доступа, а не тип файла или его содержимое. Следовательно, если обнаруживается, что каталог доступен для записи, это, вероятно, означает, что в нем могут быть созданы файлы, а не то, что каталог может быть записан в виде файла. Аналогично, файл DOS может быть указан как исполняемый, но вызов \fBexecve\fP(2) все равно завершится ошибкой. .P .\" Эти вызовы \fBaccess\fP() могут некорректно работать на файловых системах NFSv2 со включённым преобразованием UID, потому что это преобразование происходит на сервере и спрятано от клиента, который пытается проверить права (в NFS версии 3 и выше выполняется проверка на сервере). Похожие проблемы могут возникать при монтировании FUSE. .SH ОШИБКИ Поскольку системный вызов \fBfaccessat\fP() ядра Linux не поддерживает аргумент \fIflags\fP, функция\-оболочка glibc \fBfaccessat\fP(), представленная в glibc 2.32 и в более ранних версиях, эмулирует требуемую функциональность, используя комбинацию системного вызова \fBfaccessat\fP() и \fBfstatat\fP(2). Однако эта эмуляция не учитывает списки управления доступом. Начиная с glibc 2.33, функция\-оболочка позволяет избежать этой ошибки, используя системный вызов \fBfaccessat 2\fP(), который предоставляется основным ядром. .P .\" This behavior appears to have been an implementation accident. В Linux 2.4 (и более ранних версиях) есть некоторая странность в обработке тестов \fBX_OK\fP для суперпользователя. Если все категории разрешений на выполнение отключены для файла, не относящегося к каталогу, то единственный тест \fBaccess\fP(), который возвращает значение \-1, выполняется, когда \fImode\fP указан как просто \fBX_OK\fP; если \fBR_OK\fP или \fBW_OK\fP также указаны в \fImode\fP, тогда функция \fBaccess\fP() возвращает 0 для таких файлов. Ранний Linux 2.6 (вплоть до Linux 2.6.3 включительно) также вел себя так же, как и Linux 2.4. .P До Linux 2.6.20 эти вызовы игнорировали действие флага \fBMS_NOEXEC\fP, если он использовался для \fBmount\fP(2) базовой файловой системы. Начиная с Linux 2.6.20, флаг \fBMS_NOEXEC\fP поддерживается. .SH "СМОТРИТЕ ТАКЖЕ" \fBchmod\fP(2), \fBchown\fP(2), \fBopen\fP(2), \fBsetgid\fP(2), \fBsetuid\fP(2), \fBstat\fP(2), \fBeuidaccess\fP(3), \fBcredentials\fP(7), \fBpath_resolution\fP(7), \fBsymlink\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства разработал(и) Dmitry Bolkhovskikh , Yuri Kozlov , Aleksandr Felda и Kirill Rekhov . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу .MT списка рассылки русских переводчиков .ME .