linux permissions

chgrp

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

Описание

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

Группы в Linux — механизм совместного доступа: несколько пользователей, входящих в одну группу, получают одинаковые права доступа к файлам этой группы. Типичные сценарии: разработчики проекта состоят в группе developers и имеют доступ к репозиторию; системный пользователь nginx входит в группу www-data и читает файлы сайта; группа docker позволяет запускать контейнеры без sudo.

Обычный пользователь может изменить группу файла только на одну из своих групп (проверить: groups или id). Назначить файлу чужую группу, в которой пользователь не состоит, можно только от root.

Синтаксис

chgrp [ОПЦИИ] ГРУППА ФАЙЛ...
# Изменить группу одного файла chgrp developers project.conf # Изменить группу нескольких файлов chgrp www-data index.html style.css app.js # Рекурсивно для директории chgrp -R developers /srv/project/ # Скопировать группу с другого файла chgrp --reference=/etc/nginx/nginx.conf mysite.conf # Использовать числовой GID chgrp 1002 file.txt

Проверка групп пользователя

# Узнать свои группы groups # Подробно: имя, uid, основная группа и все группы id # id: uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers) # Узнать GID группы getent group developers # developers:x:1001:alice,bob,charlie

Флаги и опции

ФлагОписаниеПример
-R, --recursive Рекурсивно изменить группу для всех файлов и поддиректорий chgrp -R devs /srv/app/
-v, --verbose Выводить имя каждого обрабатываемого файла chgrp -v www-data *.html
-c, --changes Выводить только файлы, у которых группа реально изменилась chgrp -c staff /etc/app/*.conf
-f, --silent Подавить сообщения об ошибках chgrp -f devs /tmp/test
-h, --no-dereference Изменить группу самой символической ссылки, а не файла-цели chgrp -h devs symlink
--dereference Изменить группу файла-цели символической ссылки (по умолчанию) chgrp --dereference devs link
--reference=ФАЙЛ Скопировать группу с указанного файла-образца chgrp --reference=tmpl.conf new.conf
--preserve-root Отказаться от рекурсивной операции на корневом каталоге / chgrp --preserve-root -R staff /
-L При рекурсивном обходе следовать по символическим ссылкам на директории chgrp -RL devs /srv/
-P Не следовать по символическим ссылкам (по умолчанию при -R) chgrp -RP devs /srv/

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

Совместный доступ команды к проекту

# Назначить группу команды директории проекта
sudo chgrp -R developers /srv/project/
# Дать группе право на запись
chmod -R g+w /srv/project/
# SGID: новые файлы наследуют группу
chmod g+s /srv/project/

Настройка файлов веб-приложения

# Файлы доступны nginx (группа www-data)
sudo chgrp -R www-data /var/www/myapp/
sudo chmod -R 750 /var/www/myapp/
# Статика — читаема всеми
sudo chmod -R 755 /var/www/myapp/static/

Скопировать группу с образца

# Новый конфиг должен иметь ту же группу
# что и существующий
sudo chgrp --reference=/etc/app/main.conf \
     /etc/app/extra.conf
# Применить ко всем конфигам по шаблону
for f in /etc/app/*.conf.new; do
  sudo chgrp --reference=/etc/app/main.conf "$f"
done

Пользователь меняет группу своего файла

# Узнать, в каких группах состоишь
groups
# alice : alice sudo developers docker
# Изменить группу на одну из своих (без sudo!)
chgrp developers my-script.sh
chgrp docker docker-compose.yml
# На чужую группу — нельзя без root

Рекурсивно с подробным выводом

# Изменить и видеть каждый шаг
sudo chgrp -Rv www-data /var/www/html/
# changed group of '/var/www/html/index.html'
# changed group of '/var/www/html/css/style.css'
# ...
# Только изменившиеся файлы (флаг -c)
sudo chgrp -Rc www-data /var/www/html/

Проверка и диагностика

# Показать владельца и группу
ls -la file.txt
# -rw-r--r-- 1 alice developers 1024 Jun 11 file.txt
#                    ^ группа

# Числовые uid/gid
stat -c "%u:%g %U:%G %n" file.txt
# 1000:1001 alice:developers file.txt

# Найти файлы с нужной группой
find /srv -group developers -type f

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

Совет: SGID на директориях — наследование группы
Если установить SGID-бит на директорию (chmod g+s /shared/dir), все новые файлы и поддиректории, созданные внутри, автоматически унаследуют группу родительской директории — вместо основной группы создавшего пользователя. Это удобно для общих рабочих директорий команды: один раз настроил chgrp + chmod g+s, и все новые файлы автоматически в правильной группе.
Совет: chgrp vs chown :group
Команды chgrp developers file и chown :developers file делают одно и то же. Предпочитайте chgrp когда явно меняете только группу — намерение читается сразу. Используйте chown user:group когда нужно изменить и владельца, и группу одновременно.
Осторожно: нельзя назначить группу, в которой не состоишь
Обычный пользователь может назначить файлу только те группы, в которых сам состоит. Попытка chgrp чужая_группа файл завершится ошибкой «Operation not permitted». Проверьте свои группы командой id или groups. Для назначения посторонней группы используйте sudo.
Осторожно: новые сессии для применения групп
Если вы только что добавили пользователя в группу (usermod -aG developers alice), изменение вступит в силу только при следующем входе в систему. В текущей сессии alice ещё не видит новую группу и не сможет воспользоваться правами этой группы. Для немедленного применения используйте newgrp developers или начните новый сеанс (su - alice).