Добавить во вторичную группу
usermod -aG developers lisa
Нюанс, ради которого стоит перечитать свои скрипты: без
-a флаг -G не добавляет, а заменяет весь список. Было sudo,developers,ops — после usermod -G developers lisa осталось только developers. Ни ошибки, ни предупреждения, код возврата 0. Человек узнает об этом, когда в следующий раз наберёт sudo.Удалить из группы
gpasswd -d bob developers
Печатает
Removing user bob from group developers. В отличие от usermod -G, трогает ровно одну группу.Сменить GID существующей группы
groupmod -g 2000 developers
find / -xdev -nogroup 2>/dev/null
chgrp -R developers /data
Нюанс:
groupmod меняет запись в /etc/group, но файлы на диске остаются со старым числовым GID. У меня после смены ls -ld /data показал вместо имени голое 1004 — каталог стал ничьим. Ищите такие через find -nogroup и чините chgrp -R, иначе доступ к данным потеряется молча.Создать группу в скрипте
groupadd -f developers
groupadd -r pgsql
Нюанс: обычный
groupadd на существующей группе возвращает код 9 и роняет скрипт под set -e. Флаг -f делает операцию идемпотентной — то, что нужно для повторных прогонов Ansible или cloud-init. А -r создаёт системную группу: у меня она получила GID 996, обычная — 2002.Удалить группу
groupdel testers
Нюанс: если группа у кого-то основная, команда откажет —
cannot remove the primary group of user 'bob', код 8. Вторичную удалит без вопросов, и у пользователей она просто исчезнет из списка.Про проверку:
id -nG lisa показывает актуальный список из базы, а groups в чужой открытой сессии — то, что было на момент входа. Пользователь не увидит новых групп, пока не перелогинится или не выполнит newgrp.А вы группы раскатываете Ansible-модулями или скриптом с
groupadd -f?#Linux #Security #Ansible #DevOps #Bash
---
Что нашлось при проверке
Главную ловушку воспроизвёл. Завёл lisa в
sudo, developers, ops. После usermod -G developers lisa осталась одна developers, код возврата 0, ни слова в выводе. Исходник называет это в «честном минусе», но в самом пункте 7 стоит только скобка «обязательно -a» — я вынес разбор в тело, потому что это главное содержание всей темы.Находка сверх исходника: `groupmod -g` оставляет файлы без группы. Сменил GID у
developers с 1004 на 2000 — каталог /data стал показывать 1004 вместо имени. Формально данные не потеряны, но группа к ним больше не имеет отношения. Исходник даёт команду без единой оговорки. Добавил find -nogroup и chgrp -R как лечение.`groupadd -f` для идемпотентности. Обычный вызов на существующей группе — код 9. В скриптах инициализации, о которых говорит сам исходник, это ровно та причина, по которой люди начинают городить проверки через
grep /etc/group. Флага -f в исходнике нет.`groupdel` на основной группе.
cannot remove the primary group of user 'bob', код 8. Проверил обе ветки — вторичная удаляется молча.`groupadd -r` даёт GID из системного диапазона. У меня 996 против 2002 у обычной. Исходник пишет «GID до 1000» — подтвердилось.
Из пятнадцати пунктов оставил шесть. Убрал
groups, id, chgrp, find -group, newgrp, groupmod -n, gpasswd -A как отдельные блоки — по ним нечего добавить сверх справки. Мысль про groups против id вплёл в текст: она объясняет, почему пользователь «не видит» новую группу.Метрики: объём 2027, подводка 67 символов, форма — инфинитив цели. Строк кода длиннее 60 нет, восклицательных нет, хештегов 5.