Коротко: чтобы добавить существующего пользователя в группу в Linux, выполните sudo usermod -aG ГРУППА ПОЛЬЗОВАТЕЛЬ, например sudo usermod -aG docker alice. Ключ -a (append, «добавить») сохраняет остальные группы пользователя; без него -G их заменяет. Новая группа действует со следующего входа пользователя, поэтому выйдите и войдите снова, а потом проверьте результат командой id alice. Как создать пользователя в Linux и сразу добавить его в нужные группы, показано в разделе о создании пользователя.
sudo usermod -aG docker alice # добавить alice в docker, не трогая её другие группы
id alice # список теперь должен заканчиваться на ...,docker
# alice выходит и входит снова (или выполняет su - alice), и только тогда группа действуетКоманды и ключи ниже описаны по man-страницам утилит shadow (usermod, gpasswd, groupadd, newgrp, версия 4.13 из Debian 12) и adduser 3.134 из Debian. usermod и gpasswd ведут себя так же в Ubuntu и Rocky Linux.
Шпаргалка: добавить, проверить и убрать членство в группе
| Задача | Команда | Где |
|---|---|---|
| Добавить пользователя в одну группу | sudo usermod -aG docker alice | Любой дистрибутив |
| Добавить сразу в несколько групп | sudo usermod -aG sudo,docker,adm alice | Любой дистрибутив (через запятую, без пробелов) |
| Добавить по одной группе | sudo gpasswd -a alice docker | Любой дистрибутив |
| Добавить в стиле Debian | sudo adduser alice docker | Debian, Ubuntu |
| Создать пользователя сразу в группах | sudo useradd -m -s /bin/bash -G sudo alice | Любой дистрибутив (в Rocky wheel) |
| Создать новую группу | sudo groupadd developers | Любой дистрибутив |
| Показать группы пользователя | id alice | Любой дистрибутив |
| Показать участников группы | getent group docker | Любой дистрибутив |
| Убрать пользователя из группы | sudo gpasswd -d alice docker | Любой дистрибутив |
| Убрать в стиле Debian | sudo deluser alice docker | Debian, Ubuntu |
| Сменить основную группу | sudo usermod -g developers alice | Любой дистрибутив |
Почему важен -a: -G без него заменяет список групп
-G принимает полный список дополнительных групп, которые должны быть у пользователя. Man-страница говорит об этом прямо: если пользователь сейчас состоит в группе, которой нет в списке, он будет из неё удалён. -a меняет смысл на «добавить эти группы к списку». Разница на практике:
id alice
uid=1001(alice) gid=1001(alice) groups=1001(alice),27(sudo),100(users)
sudo usermod -G docker alice # ошибка: нет -a
id alice
uid=1001(alice) gid=1001(alice) groups=1001(alice),988(docker)Теперь alice состоит в docker, но уже не в sudo. Если alice была единственной учётной записью администратора, а у root нет пароля, вы остались без прав администратора. Утилиты shadow хранят предыдущую версию файла групп как /etc/group-, поэтому последствия последнего изменения легко увидеть и откатить, пока у вас ещё открыта root-оболочка:
sudo diff /etc/group- /etc/group # строки с < показывают старое состояние
sudo usermod -aG sudo,users alice # вернуть потерянные группыЕсли рабочей учётной записи с sudo не осталось, получить root придётся другим путём: через su - с паролем root или через консоль провайдера, которая даёт приглашение входа на самой машине. Та же ловушка есть в gpasswd -M alice,bob docker: эта команда задаёт полный список участников группы и выкидывает всех, кто не назван.
usermod, gpasswd или adduser: что выбрать
usermod -aGработает везде и принимает несколько групп за раз, через запятую без пробелов. При успехе ничего не выводит.gpasswd -a USER GROUPдобавляет одного пользователя в одну группу и подтверждает это строкойAdding user alice to group docker(в русской локали Debian 12:Добавление пользователя alice в группу docker). Здесь нет ключа, забыв который можно случайно заменить весь список групп, поэтому в скриптах и документации это более безопасная привычка. Обратите внимание на порядок: сначала пользователь, потом группа, то есть наоборот по сравнению сusermod -aG.adduser USER GROUP— дружелюбная обёртка Debian, она есть только в Debian и Ubuntu. С двумя именами она добавляет существующего пользователя в существующую группу; это самый короткий способ добавить пользователя в группу в Ubuntu. В Rocky Linuxadduser— просто другое имяuseradd, и так она не работает. В Alpine форма BusyBox выглядит так:addgroup alice docker.
Как узнать, в каких группах состоит пользователь
id alice # UID, основная группа и все дополнительные
groups alice # только имена
getent group docker # одна группа и её перечисленные участники
id # группы ЭТОГО сеанса, они могут быть устаревшими$ id alice
uid=1001(alice) gid=1001(alice) groups=1001(alice),27(sudo),988(docker)
$ getent group docker
docker:x:988:aliceid alice читает базу учётных записей, поэтому сразу показывает изменение. id без имени показывает, что на самом деле есть у вашей текущей оболочки. Если они расходятся, оболочка старше изменения, и об этом следующий раздел. Список участников в getent group не включает пользователей, для которых эта группа основная; почему так и что значат остальные столбцы, объясняет статья о списке пользователей и групп.
Почему новая группа ещё не работает
Процесс получает список групп в момент входа, и каждая программа, запущенная из него, наследует этот список. Изменение /etc/group не доходит до уже запущенных процессов, поэтому классический симптом выглядит так: сразу после usermod команда docker ps всё ещё отвечает permission denied. Как подхватить новую группу:
- Полностью выйти и войти снова. По SSH это значит новое соединение. Если SSH-соединения у вас мультиплексируются (
ControlMasterв~/.ssh/config), сначала закройте мастер командойssh -O exit HOST, иначе «новый» сеанс переиспользует старый. su - aliceзапускает новый вход прямо в текущем терминале.newgrp dockerзапускает новую оболочку, в которойdockerстановится активной группой. Это помогает только этой оболочке и тому, что вы из неё запустите;exitвернёт вас обратно. Для одной команды то же самое без лишней оболочки делаетsg docker -c "docker ps".- tmux и screen сохраняют старые группы. Их серверный процесс запущен до изменения, и каждое новое окно — его потомок. Закройте все сеансы (
tmux kill-server) и начните заново из свежего входа. - Службы читают группы при запуске. Служба, которая работает от имени пользователя, например CI-раннер или пул PHP-FPM, сохраняет старый список групп до
sudo systemctl restart ИМЯ.
Как создать пользователя в Linux и добавить его в группы
В Debian и Ubuntu adduser создаёт пользователя в диалоге: домашний каталог, стандартные файлы оболочки из /etc/skel, /bin/bash и запрос пароля. Затем добавьте группы:
sudo adduser alice # спросит пароль и необязательные данные
sudo usermod -aG sudo,docker aliceuseradd — низкоуровневая утилита, которая есть в любом дистрибутиве. Она умеет задать группы сразу при создании, и здесь -G без -a безопасен: заменять пока нечего. Пароль она не спрашивает, поэтому задайте его или положите SSH-ключ до первого входа:
sudo useradd -m -s /bin/bash -G sudo alice # в Rocky Linux wheel вместо sudo
sudo passwd aliceuseradd и adduser в одном абзаце: в Debian и Ubuntu useradd без ключей не создаёт домашний каталог, ставит оболочку /bin/sh и оставляет пароль заблокированным, поэтому всегда передавайте -m -s /bin/bash и задавайте пароль или ключ. adduser делает всё это сам. В Rocky Linux оба имени ведут к одной программе, а домашний каталог и bash там и так по умолчанию. В обоих семействах новый пользователь обычно получает личную основную группу со своим именем. Выдать учётной записи права администратора, проверить их и закрыть вход для root — отдельная тема, она разобрана в статье о создании пользователя с sudo (англ.).
Как создать группу для общей папки
Отдельная группа — самый аккуратный способ дать нескольким пользователям работать в одном каталоге и не выдать никому из них больше, чем нужно:
sudo groupadd developers
sudo usermod -aG developers alice
sudo usermod -aG developers bob
sudo mkdir -p /srv/project
sudo chgrp developers /srv/project
sudo chmod 2775 /srv/project # 2 означает setgid: новые файлы наследуют группуБит setgid на каталоге делает так, что каждый новый файл и подкаталог принадлежит группе developers, а не личной группе создателя. Смогут ли остальные писать в эти файлы, зависит от umask создателя: при распространённом 022 группа может новые файлы только читать, при 002 может и писать. groupadd -g 2000 developers фиксирует ID группы, и это важно, когда одна и та же группа должна совпадать на нескольких серверах, на NFS или внутри контейнеров. Как передать группе уже существующие файлы, описано в статье о команде chown (англ.).
Как удалить пользователя из группы
sudo gpasswd -d alice docker # выводит: Removing user alice from group docker
sudo deluser alice docker # Debian, Ubuntu
sudo usermod -rG docker alice # только если usermod --help показывает -r (в 4.13 из Debian 12 есть)Удаление действует с той же задержкой, что и добавление: уже открытые сеансы сохраняют группу, пока не завершатся. Чтобы отобрать доступ сразу, завершите сеансы пользователя командой sudo loginctl terminate-user alice и перезапустите службы, которые работают от его имени. sudo groupdel developers удаляет группу целиком; команда откажется это делать, пока группа остаётся основной для какого-либо пользователя.
Какие группы важны на сервере
| Группа | Что даёт членство | Что стоит знать |
|---|---|---|
sudo | Полные права root через sudo в Debian и Ubuntu | В Rocky Linux аналог называется wheel |
docker | Управление демоном Docker | Равносильно root: контейнер может смонтировать всю файловую систему хоста |
www-data | Группа веб-сервера в Debian и Ubuntu | В Rocky называется nginx или apache; после изменения перезапустите PHP-FPM |
adm | Чтение большинства логов в /var/log в Debian и Ubuntu | Только чтение |
systemd-journal | Чтение всего журнала systemd без sudo | По man journalctl то же получают adm и wheel |
Две из них требуют осторожности. Относитесь к группе docker ровно так же, как к sudo: любой её участник может стать root на хосте, поэтому статья docker: permission denied на сокете демона (англ.) советует её только для учётных записей, которым вы и так доверили бы sudo. А с www-data решите, какое направление вам нужно. Если добавить пользователя для деплоя в www-data, он сможет править файлы, которыми владеет веб-сервер. Безопаснее обратная схема: файлами владеет пользователь деплоя, их группа www-data, права 640 (у каталогов 750), так что веб-сервер может читать сайт, но не переписывать его. Никогда не добавляйте сам www-data в sudo. А тому, кому нужно только читать логи через journalctl (англ.), место в adm или systemd-journal, а не в sudo.
Частые ошибки и что они значат
usermod: group 'docker' does not exist. Группа должна сначала существовать. Создайте её черезgroupaddили установите программу, которая её приносит: пакеты Docker создают группуdocker. В русской локали Debian 12 эта ошибка выглядит какusermod: группа «docker» не существует.usermod: user 'alice' does not exist. Опечатка или перепутан порядок:usermodждёт группу после-aGи пользователя последним, аgpasswd -aждёт пользователя первым. По-русски:usermod: пользователь «alice» не существует.usermod: Permission denied.и следомcannot lock /etc/passwd; try again later.Вы запустили команду без root. Добавьте в началоsudo. Если вы root и всё равно видите сообщение о блокировке, работает или упала другая утилита для учётных записей и оставила файл блокировки вроде/etc/passwd.lock. В русской локали эти строки звучат так:usermod: доступ запрещён.ине удалось заблокировать /etc/passwd; попробуйте ещё раз позже.usermod: command not foundсразу послеsu. Обычныйsuсохраняет PATH вашего пользователя, а в Debian в нём нет/usr/sbin. Используйтеsu -.- Добавили, а всё равно не работает. Сравните вывод
idиid alice. Если группу показывает только вторая команда, сеанс старше изменения; что делать, описано выше.
На VPS или выделенном сервере
Новый Linux-сервер обычно начинает с единственного входа под root, поэтому первым изменением групп будет группа администраторов для вашей собственной учётной записи, а дальше то, что нужно вашему стеку: docker для пользователя деплоя, общая группа для каталога проекта. Держите группы администраторов и docker как можно короче, время от времени проверяйте их командой getent group sudo docker и делайте каждое изменение через -aG или gpasswd -a. Если что-то всё же пошло не так на VPS VMHeaven, VNC-консоль в личном кабинете даёт приглашение входа, которому не нужны ни SSH, ни sudo. Если у root есть пароль, этого достаточно, чтобы вернуть группы из /etc/group-.
Частые вопросы
Как добавить пользователя в группу в Linux?
Выполните sudo usermod -aG ГРУППА ПОЛЬЗОВАТЕЛЬ, например sudo usermod -aG docker alice. Ключ -a сохраняет остальные группы пользователя: без него -G заменяет весь список, и пользователь выпадает, например, из sudo. Членство действует со следующего входа, поэтому выйдите и войдите снова (или начните новый вход через su - alice) и проверьте результат командой id alice.
Почему новая группа не работает сразу после usermod?
Процесс получает список групп при входе, и уже запущенные сеансы сохраняют старый. Выйдите и войдите снова (по SSH это новое соединение), выполните su - ПОЛЬЗОВАТЕЛЬ или используйте newgrp ГРУППА для одной оболочки. Сервер tmux или screen, запущенный до изменения, и службы, работающие от имени этого пользователя, тоже нужно перезапустить.
Как создать нового пользователя в Linux?
В Debian и Ubuntu команда sudo adduser alice создаёт домашний каталог, назначает оболочку bash и спрашивает пароль. В любом дистрибутиве то же делает sudo useradd -m -s /bin/bash alice и затем sudo passwd alice; добавьте -G sudo (в Rocky Linux wheel), чтобы сразу включить нового пользователя в группы.