chgrp
Изменить группу-владельца файла или директории
Описание
Команда chgrp (change group) изменяет группу-владельца файла или директории. В отличие от chown, которая может менять и владельца, и группу, chgrp специализируется исключительно на группе. Это делает команду семантически точной: если в скрипте или команде нужно изменить только группу, chgrp выражает намерение явнее, чем chown :группа.
Группы в Linux — механизм совместного доступа: несколько пользователей, входящих в одну группу, получают одинаковые права доступа к файлам этой группы. Типичные сценарии: разработчики проекта состоят в группе developers и имеют доступ к репозиторию; системный пользователь nginx входит в группу www-data и читает файлы сайта; группа docker позволяет запускать контейнеры без sudo.
Обычный пользователь может изменить группу файла только на одну из своих групп (проверить: groups или id). Назначить файлу чужую группу, в которой пользователь не состоит, можно только от root.
Синтаксис
Проверка групп пользователя
Флаги и опции
| Флаг | Описание | Пример |
|---|---|---|
-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-бит на директорию (
chmod g+s /shared/dir), все новые файлы и поддиректории, созданные внутри, автоматически унаследуют группу родительской директории — вместо основной группы создавшего пользователя. Это удобно для общих рабочих директорий команды: один раз настроил chgrp + chmod g+s, и все новые файлы автоматически в правильной группе.
Команды
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).