chown
Смена владельца и группы файла; chgrp — только группы
chown назначает файлу владельца и группу. От них зависит, какая тройка прав из chmod применяется к пользователю. Менять владельца может только root; обычный пользователь может лишь сменить группу своего файла на одну из своих групп (chgrp).
Синтаксис
chown [опции] владелец[:группа] файл…
chown [опции] --reference=образец файл…
chgrp [опции] группа файл…
Владельца и группу можно указать именем или числом (UID/GID). Посмотреть текущих: ls -l файл (третья и четвёртая колонки) или stat -c '%U:%G' файл.
Формы записи
| Запись | Что меняет |
|---|---|
alice | только владельца |
alice:devs | владельца и группу |
:devs | только группу (то же, что chgrp devs) |
alice: | владельца, а группу — на основную группу alice |
1001:1001 | по числовым UID и GID, даже если такого пользователя нет |
Опции
| Опция | Что делает |
|---|---|
-R | рекурсивно по каталогу |
-c / -v | сообщать об изменённых файлах / обо всех |
-f | не печатать большинство ошибок (код возврата всё равно ненулевой) |
--reference=образец | взять владельца и группу с другого файла |
--from=старый:старая | менять только файлы с указанным текущим владельцем и/или группой (--from=root, --from=:www-data) |
--preserve-root | отказаться работать рекурсивно на / |
Символические ссылки
| Опция | Что делает |
|---|---|
| (по умолчанию) | файл из командной строки — меняется цель ссылки; внутри -R ссылки не разыменовываются |
-h | менять владельца самой ссылки, а не цели |
-R -H | разыменовать ссылки, указанные в командной строке, и пройти внутрь |
-R -L | разыменовывать все ссылки на каталоги в дереве — опасно, можно уйти за пределы каталога |
-R -P | не разыменовывать ничего (по умолчанию для -R) |
Все эти опции есть и у chgrp.
Примеры
# отдать каталог приложения пользователю и группе www-data
chown -R www-data:www-data /srv/app
# сменить только группу
chgrp devs report.txt
chown :devs report.txt
# владелец и его основная группа
chown alice: notes.txt
# во всём дереве сменить владельца только у файлов, принадлежавших root
chown -R --from=root alice ~/project
# скопировать владельца с соседнего файла
chown --reference=/etc/hosts /etc/hosts.new
# владелец символической ссылки, а не файла, на который она указывает
chown -h alice /srv/app/current
# показать только реальные изменения
chown -Rc alice:devs /srv/shared
# найти и исправить файлы с «осиротевшим» владельцем
find /srv -nouser -exec chown root:root {} +
# проверить результат
stat -c '%U:%G %n' /srv/app /srv/app/*
Подводные камни
- Пользователь должен существовать.
chown bob файлбез пользователяbobдаст «invalid user». Проверь:id bobилиgetent passwd bob. То же с группой: «invalid group». - Числовой UID без пользователя принимается молча, и в
ls -lбудет число вместо имени. Так бывает с файлами из архивов и томов контейнеров. - setuid и setgid сбрасываются при смене владельца: файл
4755послеchownстановится0755. Если бит нужен — ставьchmodпослеchown. - Символические ссылки. Без
-hchown ссылкаменяет владельца целевого файла. При-Rссылки внутри дерева не разыменовываются — файлы вне каталога не затронутся, а вот с-Lзатронутся. - Точка вместо двоеточия (
alice.devs) — устаревшая форма: новые версии печатают предупреждение. Пишиalice:devs. - Обычный пользователь не может отдать файл другому («Operation not permitted»), а
chgrpразрешён только в группу, где он состоит. - Сменить владельца — не значит дать доступ. Если у владельца в правах нет
rилиw, он всё равно получит «Permission denied». Смотри права черезls -l.