chmod

CHMOD(2)                 Руководство программиста Linux                 CHMOD(2)



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

ОБЗОР
       #include <sys/stat.h>

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

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

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

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

       fchmod():
           /* начиная с glibc 2.16: */ _POSIX_C_SOURCE
               || /* версии glibc <= 2.19: */ _BSD_SOURCE
               || /* версии glibc <= 2.15: */ _XOPEN_SOURCE >= 500
               || /* Glibc 2.12 - 2.15: */ _POSIX_C_SOURCE >= 200809L

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

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

       * Вызов chmod() изменяет режим файла, задаваемого путём из параметра
         pathname, который разыменовывается, если является символьной ссылкой.

       * Вызов 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 для каталогов смотрите в
       stat(2).

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

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

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

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

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

       Значение flags может быть 0, или включать следующие флаги:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

       Общий набор ошибок для fchmod() таков:

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

       EIO    См. выше.

       EPERM  См. выше.

       EROFS  См. выше.

       В fchmodat() могут возникнуть те же ошибки, что и в chmod(). Также, в
       fchmodat() могут возникнуть следующие ошибки:

       EBADF  Значение dirfd не является правильным файловым дескриптором.

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

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

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

ВЕРСИИ
       Вызов fchmodat() был добавлен в ядро Linux версии 2.6.16; поддержка в
       glibc доступна с версии 2.4.

СООТВЕТСТВИЕ СТАНДАРТАМ
       chmod(), fchmod(): 4.4BSD, SVr4, POSIX.1-2001i, POSIX.1-2008.

       fchmodat(): POSIX.1-2008.

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

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

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



Linux                              2016-03-15                           CHMOD(2)