chmod(2)

НАИМЕНОВАНИЕ
chmod, fchmod, fchmodat - изменяет права доступа к файлу

БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)

СИНТАКСИС
#include <sys/stat.h>

int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);

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

int fchmodat(int dirfd, const char *path, mode_t mode, int flags);

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

fchmod():
    Начиная с glibc 2.24:
        _POSIX_C_SOURCE >= 199309L
    glibc 2.19 до glibc 2.23
        _POSIX_C_SOURCE
    glibc 2.16 до glibc 2.19:
        _BSD_SOURCE || _POSIX_C_SOURCE
    glibc 2.12 до glibc 2.16:
        _BSD_SOURCE || _XOPEN_SOURCE >= 500
            || _POSIX_C_SOURCE >= 200809L
    glibc 2.11 и ранее:
        _BSD_SOURCE || _XOPEN_SOURCE >= 500

fchmodat():
    Начиная с glibc 2.10:
        _POSIX_C_SOURCE >= 200809L
    До glibc 2.10:
        _ATFILE_SOURCE

ОПИСАНИЕ
Системные вызовы chmod() и fchmod() изменяют биты режима файла (режим файла состоит из бит прав доступа к файлу плюс биты set-user-ID, set-group-ID и бит закрепления) Данные системные вызовы отличаются только способом указания файла:

•   chmod() changes the mode of the file specified whose pathname is given in path, which is dereferenced if it is a symbolic link.

•   Вызов fchown() изменяет режим файла, задаваемого открытым файловым дескриптором fd.

Новый режим файла указывается в mode и представляет собой битовую маску, создаваемую побитовым сложением нуля или более следующих констант:

S_ISUID (04000)
    set-user-ID (установить эффективный идентификатор пользователя процесса при execve(2))

S_ISGID (02000)
    set-group-ID (установить эффективный идентификатор группы процесса при execve(2); обязательная блокировка, описывается в fcntl(2); выбрать новую группу файла от родительского каталога, описывается в chown(2) и mkdir(2))

S_ISVTX (01000)
    закрепляющий бит (ограничительный флаг удаления, описывается в unlink(2))

S_IRUSR (00400)
    владелец может читать

S_IWUSR (00200)
    владелец может писать

S_IXUSR (00100)
    владелец может выполнять файл или искать в каталоге ("поиск" применим к каталогам и означает, что к элементам внутри каталога есть доступ)

S_IRGRP (00040)
    группа-владелец может читать

S_IWGRP (00020)
    группа-владелец может писать

S_IXGRP (00010)
    группа-владелец может выполнять файл или искать в каталоге

S_IROTH (00004)
    все остальные могут читать

S_IWOTH (00002)
    все остальные могут писать

S_IXOTH (00001)
    все остальные могут выполнять файл или искать в каталоге

Эффективный идентификатор пользователя (UID) вызывающего процесса должен совпадать с UID владельца файла или процесс должен быть привилегированным (Linux: у него должен быть мандат CAP_FOWNER).

Если вызывающий процесс не является привилегированным (Linux: не имеет мандата CAP_FSETID), а группа-владелец файла не совпадает с эффективным групповым ID процесса или одним из его дополнительных групповых идентификаторов, то бит S_ISGID будет сброшен, но ошибки при этом не возникнет.

В зависимости от файловой системы в целях безопасности биты выполнения set-user-ID и set-group-ID могут сбрасываться при записи в файл (в Linux это происходит, если записывающий процесс не имеет мандата CAP_FSETID). В некоторых файловых системах только суперпользователь может устанавливать закрепляющий бит, который может иметь специальное назначение. Значения закрепляющего бита, set-user-ID и set-group-ID для каталогов смотрите в inode(7).

В файловых системах NFS ограничивающие права сразу начинают действовать даже уже на открытые файлы, так как контроль доступа выполняется сервером, но открытые файлы находятся в ведении клиента. Распространение прав может откладываться для других клиентов, если у них установлен атрибут кэширования.

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

If path is relative, then it is interpreted relative to the directory referred to by the file descriptor dirfd (rather than relative to the current working directory of the calling process, as is done by chmod() for a relative pathname).

If path is relative and dirfd is the special value AT_FDCWD, then path is interpreted relative to the current working directory of the calling process (like chmod()).

If path is absolute, then dirfd is ignored.

flags can either be 0, or include the following flags:

AT_EMPTY_PATH (since Linux 6.6)
    If path is an empty string, operate on the file referred to by dirfd (which may have been obtained using the open(2) O_PATH flag). In this case, dirfd can refer to any type of file, not just a directory. If dirfd is AT_FDCWD, the call operates on the current working directory. This flag is Linux-specific; define _GNU_SOURCE to obtain its definition.

AT_SYMLINK_NOFOLLOW
    If path is a symbolic link, do not dereference it: instead operate on the link itself.

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

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.

ОШИБКИ
В зависимости от файловой системы могут также возвращаться другие ошибки, перечисленные далее.

Наиболее распространённые ошибки chmod() перечислены далее:

EACCES
    Поиск запрещён из-за одного из частей префикса пути (См. также path_resolution(7).)

EBADF
    (fchmod()) Файловый дескриптор fd не действителен.

EBADF
    (fchmodat()) path is relative but dirfd is neither AT_FDCWD nor a valid file descriptor.

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

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

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

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

ENAMETOOLONG
    path слишком длинен.

ENOENT
    Файл не существует.

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

ENOTDIR
    Компонент в префиксе пути не является каталогом.

ENOTDIR
    (fchmodat()) path is relative and dirfd is a file descriptor referring to a file other than a directory.

ENOTSUP
    (fchmodat()) В flags указано AT_SYMLINK_NOFOLLOW, но оно не поддерживается.

EPERM
    Эффективный UID не совпадает с идентификатором владельца файла, а процесс не является привилегированным (Linux: не имеет мандата CAP_FOWNER).

EPERM
    Файл помечен как неизменяемый (immutable) или только для добавления (смотрите FS_IOC_SETFLAGS(2const)).

EROFS
    Указанный файл находится на файловой системе, смонтированной только для чтения.

ВЕРСИИ

  Отличия между библиотекой C и ядром
В этой странице описана обёрточная функция fchmodat() библиотеки GNU C, реализующая POSIX-интерфейс. Данный интерфейс отличается от лежащего в основе системного вызова Linux тем, что имеет аргумент flags.

  Замечания по glibc
On older kernels where fchmodat() is unavailable, the glibc wrapper function falls back to the use of chmod(). When path is a relative pathname, glibc constructs a pathname based on the symbolic link in /proc/self/fd that corresponds to the dirfd argument.

СТАНДАРТЫ
POSIX.1-2024.

ИСТОРИЯ

chmod()
    SVr4, POSIX.1-1988, 4.4BSD.

fchmod()
    SVr4, 4.4BSD, SUSv1, POSIX.1-1996.

fchmodat()
    POSIX.1-2008. Linux 2.6.16, glibc 2.4.

AT_SYMLINK_NOFOLLOW
    POSIX.1-2008, glibc 2.32, Linux 6.5.

СМОТРИТЕ ТАКЖЕ
chmod(1), chown(2), execve(2), open(2), stat(2), inode(7), path_resolution(7), symlink(7)

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (debian-l10n-russian@lists.debian.org).