chown
Изменить владельца и/или группу файла или директории
Описание
Команда chown (change owner) позволяет изменить владельца файла или директории, а также одновременно изменить группу-владельца. В UNIX-системах каждый файл имеет ровно одного владельца (пользователя) и одну группу-владельца. Именно от них зависят права доступа: что может делать владелец, что может группа, и что могут все остальные.
Исторически chown появилась вместе с самой концепцией многопользовательских UNIX-систем. Только суперпользователь (root) может передать владение файлом другому пользователю — обычный пользователь не может «подарить» файл, только root управляет этим. Это защита от злоупотреблений дисковыми квотами и правами.
Типичные сценарии использования: передача файлов при переезде сервиса на нового системного пользователя, исправление прав после копирования файлов от root, настройка владельца для файлов веб-приложения, восстановление корректного владельца после операций с архивами.
Синтаксис
Форматы указания владельца
| Формат | Что меняется | Пример |
|---|---|---|
ВЛАДЕЛЕЦ | Только пользователь-владелец | 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. Если на исходном сервере alice имела UID 1001, а на целевом — UID 1002, файлы окажутся у «чужого» пользователя. Используйте
stat -c "%u %g" файл для проверки числовых идентификаторов и id username для сравнения с пользователем.
Для изменения только группы можно использовать как
chown :группа файл, так и отдельную команду chgrp группа файл. Они эквивалентны. Команда chgrp исторически существует отдельно и в некоторых скриптах читается нагляднее — используйте её, если меняете только группу.
Обычный пользователь не может передать свои файлы другому пользователю командой
chown другой_пользователь файл — получит ошибку «Operation not permitted». Это ограничение умышленно: иначе пользователь мог бы обходить дисковые квоты, передавая файлы другим. Для смены владельца всегда нужен sudo.
При рекурсивной смене владельца
chown -R по умолчанию не следует по символическим ссылкам на директории. Если в дереве есть симлинки на внешние директории, их содержимое затронуто не будет. Чтобы явно следовать по симлинкам, используйте флаг -L, но делайте это осторожно: можно изменить файлы за пределами ожидаемой области.