.\" -*- coding: UTF-8 -*- .\" This manpage is Copyright (C) 1992 Drew Eckhardt; .\" and Copyright (C) 1993 Michael Haardt, Ian Jackson. .\" and Copyright (C) 2004, 2006, 2007, 2014 Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Modified 1993-07-21 Rik Faith (faith@cs.unc.edu) .\" Modified 1994-08-21 by Michael Chastain (mec@shell.portal.com): .\" Removed note about old kernel (pre-1.1.44) using wrong id on path. .\" Modified 1996-03-18 by Martin Schulze (joey@infodrom.north.de): .\" Stated more clearly how it behaves with symbolic links. .\" Added correction due to Nick Duffek (nsd@bbc.com), aeb, 960426 .\" Modified 1996-09-07 by Michael Haardt: .\" Restrictions for NFS .\" Modified 1997-09-09 by Joseph S. Myers .\" Modified 1998-01-13 by Michael Haardt: .\" Using access is often insecure .\" Modified 2001-10-16 by aeb .\" Modified 2002-04-23 by Roger Luethi .\" Modified 2004-06-23 by Michael Kerrisk .\" 2007-06-10, mtk, various parts rewritten, and added BUGS section. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH access 2 2024\-06\-13 "Linux man\-pages 6.9.1" .SH НАИМЕНОВАНИЕ access, faccessat, faccessat2 \- проверка прав доступа пользователя к файлу .SH БИБЛИОТЕКА Стандартная библиотека C (\fIlibc\fP, \fI\-lc\fP) .SH ОБЗОР .nf \fB#include \fP .P \fBint access(const char *\fP\fIpathname\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\fIpathname\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\fIpathname\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 проверяет, имеет ли вызвавший процесс права доступа к файлу \fIpathname\fP. Если \fIpathname\fP является символьной ссылкой, то проверяются права доступа к файлу, на который она ссылается. .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 Если в \fIpathname\fP задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор \fIdirfd\fP (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в \fBaccess\fP()). .P Если в \fIpathname\fP задан относительный путь и \fIdirfd\fP равно специальному значению \fBAT_FDCWD\fP, то \fIpathname\fP рассматривается относительно текущего рабочего каталога вызывающего процесса (как \fBaccess\fP()). .P Если в \fIpathname\fP задан абсолютный путь, то \fIdirfd\fP игнорируется. .P Значение \fIflags\fP получается с помощью операции логическое ИЛИ с нулём или со следующими значениями: .TP \fBAT_EACCESS\fP Выполнять проверку, доступа используя эффективный идентификатор пользователя и группы. По умолчанию в \fBfaccessat\fP() используются реальные идентификаторы (как в \fBaccess\fP()). .TP \fBAT_EMPTY_PATH\fP (начиная с Linux 5.8) Если \fIpathname\fP \- пустая строка, выполните операцию с файлом, на который ссылается \fIdirfd\fP (который, возможно, был получен с использованием флага \fBopen\fP(2) \fBO_PATH\fP). В этом случае, \fIdirfd\fP может ссылаться на любой тип файла, а не только на каталог. Если \fIdirfd\fP равно \fBAT_FDCWD\fP, вызов выполняется в текущем рабочем каталоге. Этот флаг специфичен для Linux; определите \fB_GNU_SOURCE\fP, чтобы получить его определение. .TP \fBAT_SYMLINK_NOFOLLOW\fP Если значение \fIpathname\fP является символьной ссылкой, не разыменовывать её, а выдать информацию о самой ссылке. .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 В запрошенном доступе к файлу будет отказано, или будет отказано в разрешении на поиск по одному из каталогов с префиксом пути \fIpathname\fP. (Смотрите также \fBpath_resolution\fP(7)). .TP \fBEBADF\fP (\fBfaccessat\fP()) \fIpathname\fP является относительным, но \fIdirfd\fP не является ни \fBAT_FDCWD\fP (\fBfaccessat\fP()), ни допустимым файловым дескриптором. .TP \fBEFAULT\fP Аргумент \fIpathname\fP указывает за пределы доступного адресного пространства. .TP \fBEINVAL\fP Аргумент \fImode\fP был задан неверно. .TP \fBEINVAL\fP (\fBfaccessat\fP()) Указано неверное значение в \fIflags\fP. .TP \fBEIO\fP Произошла ошибка ввода\-вывода. .TP \fBELOOP\fP Во время определения \fIpathname\fP встретилось слишком много символьных ссылок. .TP \fBENAMETOOLONG\fP Слишком длинное значение аргумента \fIpathname\fP. .TP \fBENOENT\fP Компонент пути \fIpathname\fP не существует или является "битой, висячей" символьной ссылкой. .TP \fBENOMEM\fP Недостаточное количество памяти ядра. .TP \fBENOTDIR\fP Компонент пути, использованный как каталог в \fIpathname\fP, в действительности таковым не является. .TP \fBENOTDIR\fP (\fBfaccessat\fP()) Значение \fIpathname\fP содержит относительный путь и \fIdirfd\fP содержит файловый дескриптор, указывающий на файл, а не на каталог. .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" В старых ядрах, где \fBfaccessat\fP() отсутствует (и если не указаны флаги \fBAT_EACCESS\fP и \fBAT_SYMLINK_NOFOLLOW\fP), функция\-обертка glibc использует \fBaccess\fP(). Если \fIpathname\fP является относительным путём, то glibc собирает путь относительно символической ссылки в \fI/proc/self/fd\fP, которая соответствует аргументу \fIdirfd\fP. .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 Файл доступен только в случае, если для каждого каталога в пути, указанном в \fIpathname\fP, имеется право выполнять поиск (то есть, установлен бит выполнения). Если какой\-то каталог недоступен, то вызов \fBaccess\fP() завершается ошибкой, независимо от имеющихся прав доступа к файлу. .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 . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу .MT списка рассылки русских переводчиков .ME .