linux permissions

chown

Изменить владельца и/или группу файла или директории

Описание

Команда chown (change owner) позволяет изменить владельца файла или директории, а также одновременно изменить группу-владельца. В UNIX-системах каждый файл имеет ровно одного владельца (пользователя) и одну группу-владельца. Именно от них зависят права доступа: что может делать владелец, что может группа, и что могут все остальные.

Исторически chown появилась вместе с самой концепцией многопользовательских UNIX-систем. Только суперпользователь (root) может передать владение файлом другому пользователю — обычный пользователь не может «подарить» файл, только root управляет этим. Это защита от злоупотреблений дисковыми квотами и правами.

Типичные сценарии использования: передача файлов при переезде сервиса на нового системного пользователя, исправление прав после копирования файлов от root, настройка владельца для файлов веб-приложения, восстановление корректного владельца после операций с архивами.

Синтаксис

chown [ОПЦИИ] [ВЛАДЕЛЕЦ][:[ГРУППА]] ФАЙЛ...
# Изменить только владельца chown alice file.txt # Изменить владельца и группу chown alice:developers file.txt # Изменить только группу (двоеточие без владельца) chown :developers file.txt # Рекурсивно для директории chown -R www-data:www-data /var/www/html/ # Использовать числовые UID:GID chown 1001:1002 file.txt

Форматы указания владельца

ФорматЧто меняетсяПример
ВЛАДЕЛЕЦТолько пользователь-владелецchown alice file
ВЛАДЕЛЕЦ:ГРУППАПользователь и группаchown alice:dev file
ВЛАДЕЛЕЦ:Пользователь + его основная группаchown alice: file
:ГРУППАТолько группа (как chgrp)chown :dev file
UID:GIDПо числовым идентификаторамchown 1001:1002 file

Флаги и опции

ФлагОписаниеПример
-R, --recursive Рекурсивно изменить владельца для всех файлов и поддиректорий chown -R user:group /srv/app/
-v, --verbose Выводить имя каждого обрабатываемого файла chown -v alice file.txt
-c, --changes Выводить только файлы, у которых владелец реально изменился chown -c bob:staff *.conf
-f, --silent Не выводить сообщения об ошибках chown -f alice /tmp/test
-h, --no-dereference Изменить владельца самой символической ссылки, а не файла, на который она указывает chown -h alice symlink
--dereference Изменить владельца файла-назначения символической ссылки (поведение по умолчанию) chown --dereference alice link
--reference=ФАЙЛ Скопировать владельца и группу с указанного файла-образца chown --reference=src.txt dst.txt
--preserve-root Запретить рекурсивную операцию на корневом каталоге / chown --preserve-root -R user /
--from=ВЛАД:ГРУП Изменить только если текущий владелец/группа совпадают с указанными chown --from=old:old new:new file
--version Показать версию утилиты chown --version

Паттерны использования

Передать файлы веб-серверу

# Сделать www-data владельцем сайта
sudo chown -R www-data:www-data /var/www/html/
# Проверить
ls -la /var/www/html/
# drwxr-xr-x 2 www-data www-data 4096 Jun 11 html/

Исправить права после sudo-операций

# После работы от root файлы принадлежат root
sudo cp config.yml /etc/myapp/
# Вернуть файлам правильного владельца
sudo chown myapp:myapp /etc/myapp/config.yml
# Или рекурсивно всю директорию
sudo chown -R myapp:myapp /etc/myapp/

Скопировать владельца с образца

# Новый файл должен иметь тех же
# владельца и группу, что и существующий
sudo chown --reference=/etc/nginx/nginx.conf \
     /etc/nginx/sites-available/mysite.conf
# Полезно при шаблонировании конфигов

Изменить только группу через chown

# Эквивалент chgrp developers file.txt
chown :developers file.txt
# Изменить владельца, группа — основная группа alice
chown alice: file.txt
# Проверить uid/gid файла
stat -c "%U %G" file.txt
# alice developers

Условная смена владельца (--from)

# Сменить владельца только если сейчас 'old_user'
sudo chown --from=old_user new_user /srv/data/*
# Сменить только если владелец AND группа совпадают
sudo chown --from=old_user:old_group \
     new_user:new_group /srv/data/*

Работа с символическими ссылками

# По умолчанию — меняет владельца цели ссылки
chown alice symlink -> меняет target_file

# Изменить владельца самой ссылки (не цели)
chown -h alice symlink

# Проверить владельца ссылки и цели
ls -la symlink    # ссылка
ls -la $(readlink symlink)  # цель

Советы и предупреждения

Совет: проверяйте UID/GID при переносе между системами
При переносе файлов между серверами пользователи могут иметь разные UID. Если на исходном сервере alice имела UID 1001, а на целевом — UID 1002, файлы окажутся у «чужого» пользователя. Используйте stat -c "%u %g" файл для проверки числовых идентификаторов и id username для сравнения с пользователем.
Совет: chown vs chgrp
Для изменения только группы можно использовать как chown :группа файл, так и отдельную команду chgrp группа файл. Они эквивалентны. Команда chgrp исторически существует отдельно и в некоторых скриптах читается нагляднее — используйте её, если меняете только группу.
Осторожно: только root может передавать владение
Обычный пользователь не может передать свои файлы другому пользователю командой chown другой_пользователь файл — получит ошибку «Operation not permitted». Это ограничение умышленно: иначе пользователь мог бы обходить дисковые квоты, передавая файлы другим. Для смены владельца всегда нужен sudo.
Осторожно: chown -R на директориях с символическими ссылками
При рекурсивной смене владельца chown -R по умолчанию не следует по символическим ссылкам на директории. Если в дереве есть симлинки на внешние директории, их содержимое затронуто не будет. Чтобы явно следовать по симлинкам, используйте флаг -L, но делайте это осторожно: можно изменить файлы за пределами ожидаемой области.