Provided by: manpages-ru-dev_4.21.0-2_all bug

ИМЯ

       chown, fchown, lchown, fchownat - изменяет владельца файла

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <unistd.h>

       int chown(const char *pathname, uid_t owner, gid_t group);
       int fchown(int fd, uid_t owner, gid_t group);
       int lchown(const char *pathname, uid_t owner, gid_t group);

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

       int fchownat(int dirfd, const char *pathname,
                    uid_t owner, gid_t group, int flags);

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

       fchown(), lchown():
           /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
               || _XOPEN_SOURCE >= 500
               || /* glibc <= 2.19: */ _BSD_SOURCE

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

ОПИСАНИЕ

       Данные  системные  вызовы изменяют владельца и группу для файла. Системные вызовы chown(),
       fchown() и lchown() отличаются только в том, каким образом задается файл:

       •  chown()  изменяет  владельца  для  файла,  задаваемого  параметром  pathname,   который
          разыменовывается, если является символьной ссылкой.

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

       •  lchown()  похож  на  chown()  за  исключением того, что он не разыменовывает символьные
          ссылки.

       Только привилегированный процесс (Linux: имеющий мандат CAP_CHOWN) может сменить владельца
       файла.  Владелец  файла может сменить группу файла на любую группу, в которой он числится.
       Привилегированный процесс (Linux: с CAP_CHOWN) может задавать произвольную группу.

       Если параметр owner или group равен -1, то соответствующий идентификатор не изменяется.

       Когда владелец или группа исполняемого файла изменяется непривилегированным пользователем,
       то  биты  режима  S_ISUID  и  S_ISGID  сбрасываются  В  POSIX  не  указано,  должно ли это
       происходить если chown() выполняется суперпользователем;  поведение  в  Linux  зависит  от
       версии  ядра  и  начиная  с Linux 2.2.13, root рассматривается как обычный пользователь. В
       случае исполняемого файла вне группы (т. е., у которого не  установлен  бит  S_IXGRP)  бит
       S_ISGID указывает на обязательную блокировку, и не сбрасывается при выполнении chown().

       Когда  владелец  или  группа  исполняемого  файла изменяется (любым пользователем), то все
       наборы мандатов файла очищаются.

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

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

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

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

       Аргумент  flags  представляет  собой  битовую  маску, создаваемую побитовым сложением (OR)
       следующих значений;

       AT_EMPTY_PATH (начиная с Linux 2.6.39)
              Если значение pathname равно пустой строке, то выполнять действие  над  файлом,  на
              который  указывает  dirfd  (который  может  быть получен с помощью open(2) с флагом
              O_PATH). В этом случае, dirfd может указывать на файл любого типа, а не  только  на
              каталог. Если dirfd равно AT_FDCWD, то вызов выполняет действие над текущим рабочим
              каталогом. Этот флаг есть только в Linux; для получения его определения  определите
              _GNU_SOURCE.

       AT_SYMLINK_NOFOLLOW
              Если  значение  pathname  является  символьной  ссылкой,  не  разыменовывать  её, а
              изменить владельца самой  ссылки,  как  это  делается  в  lchown()  (по  умолчанию,
              fchownat() разыменовывает символьные ссылки как и chown()).

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

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

       On  success, zero is returned.  On error, -1 is returned, and errno is set to indicate the
       error.

ОШИБКИ

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

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

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

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

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

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

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

       EIO    (fchown())   Во   время   изменения   индексного   дескриптора   (inode)   возникла
              низкоуровневая ошибка ввода/вывода.

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

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

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

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

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

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

       EPERM  Вызывающий процесс не имеет требуемых прав (см.  выше),  чтобы  изменять  владельца
              и/или группу.

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

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

ВЕРСИИ

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

СТАНДАРТЫ

       chown(), fchown(), lchown(): 4.4BSD, SVr4, POSIX.1-2001, POSIX.1-2008.

       Версия  из  4.4BSD  может  использоваться  только  суперпользователем  (то  есть,  обычные
       пользователи не могут менять владельцев).

       fchownat(): POSIX.1-2008.

ЗАМЕЧАНИЯ

   Назначение владельца новых файлов
       При создании нового файла (например, с помощью open(2) или mkdir(2)), его владельцем будет
       установлен ID пользователя из файловой системы создающего процесса. Группа  файла  зависит
       от  нескольких факторов, включая тип файловой системы, параметры монтирования и установлен
       ли бит режима set-group-ID на родительском каталоге. Если  файловая  система  поддерживает
       параметры   mount(8)  -o grpid  (тоже  что  и  -o bsdgroups)  и  -o nogrpid  (тоже  что  и
       -o sysvgroups), то правила следующие:

       •  Если файловая система смонтирована с параметром -o grpid, то группой нового файла будет
          группа родительского каталога.

       •  Если  файловая  система смонтирована с параметром -o nogrpid и у родительского каталога
          нет бита set-group-ID, то группой нового файла  будет  GID  файловой  системы  того  же
          процесса.

       •  Если  файловая  система смонтирована с параметром -o nogrpid и на родительском каталоге
          установлен бит  set-group-ID,  то  группой  нового  файла  будет  группа  родительского
          каталога.

       Начиная  с  Linux  4.12,  параметры  монтирования -o grpid и -o nogrpid поддерживаются для
       ext2, ext3, ext4 и XFS. Для файловых систем, не поддерживающих эти параметры монтирования,
       используются правила как для -o nogrpid.

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

   NFS
       Семантика  chown()  сознательно  нарушается  в  файловых  системах NFS, в которых включено
       отображение UID. Также, нарушается семантика всех системных вызовов, которые  обеспечивают
       доступ  к содержимому файлов, так как chown() может привести к немедленному отзыву доступа
       к уже открытым файлам. Кэширование на клиентской стороне может привести к  задержке  между
       сменой доступа пользователю и временем, когда файл действительно станет доступным.

   Историческая справка
       Первоначальные  версии системных вызовов chown(), fchown() и lchown() в Linux поддерживали
       только 16-битные идентификаторы пользователей и групп. Позднее в Linux 2.4 были  добавлены
       вызовы  chown32(),  fchown32()  и  lchown32(),  поддерживающие 32-битные идентификаторы. В
       glibc обёрточные функции chown(), fchown() и lchown() работают одинаково  вне  зависимости
       от версий ядра.

       Before  Linux 2.1.81 (except 2.1.46), chown()  did not follow symbolic links.  Since Linux
       2.1.81, chown()  does follow symbolic links, and there is a new system call lchown()  that
       does  not  follow  symbolic  links.   Since Linux 2.1.86, this new call (that has the same
       semantics as the old chown())  has got the same syscall number, and chown()  got the newly
       introduced number.

ПРИМЕРЫ

       Следующая  программа  изменять  владельца  файла, указанного вторым в командной строке, на
       значение, указанное в первом аргументе командной строки. Новый владелец может задаваться в
       виде  числового пользовательского ID, или в виде имени пользователя (которое преобразуется
       в пользовательский  ID  с  помощью  getpwnam(3),  выполняющего  поиск  в  системном  файле
       паролей).

   Исходный код программы
       #include <pwd.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>

       int
       main(int argc, char *argv[])
       {
           char           *endptr;
           uid_t          uid;
           struct passwd  *pwd;

           if (argc != 3 || argv[1][0] == '\0') {
               fprintf(stderr, "%s <owner> <file>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           uid = strtol(argv[1], &endptr, 10);  /* Allow a numeric string */

           if (*endptr != '\0') {         /* Was not pure numeric string */
               pwd = getpwnam(argv[1]);   /* Try getting UID for username */
               if (pwd == NULL) {
                   perror("getpwnam");
                   exit(EXIT_FAILURE);
               }

               uid = pwd->pw_uid;
           }

           if (chown(argv[2], uid, -1) == -1) {
               perror("chown");
               exit(EXIT_FAILURE);
           }

           exit(EXIT_SUCCESS);
       }

СМ. ТАКЖЕ

       chgrp(1), chown(1), chmod(2), flock(2), 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 версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

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