Руководства

Как добавить пользователя в группу в Linux: usermod -aG, gpasswd и adduser

Как добавить пользователя в группу в Linux: sudo usermod -aG ГРУППА ПОЛЬЗОВАТЕЛЬ и новый вход. Почему важен -a, gpasswd, adduser и как создать пользователя.

Опубликовано ~9 мин чтения
На этой странице

Коротко: чтобы добавить существующего пользователя в группу в Linux, выполните sudo usermod -aG ГРУППА ПОЛЬЗОВАТЕЛЬ, например sudo usermod -aG docker alice. Ключ -a (append, «добавить») сохраняет остальные группы пользователя; без него -G их заменяет. Новая группа действует со следующего входа пользователя, поэтому выйдите и войдите снова, а потом проверьте результат командой id alice. Как создать пользователя в Linux и сразу добавить его в нужные группы, показано в разделе о создании пользователя.

любой 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Любой дистрибутив
Добавить в стиле Debiansudo adduser alice dockerDebian, 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Любой дистрибутив
Убрать в стиле Debiansudo deluser alice dockerDebian, Ubuntu
Сменить основную группуsudo usermod -g developers aliceЛюбой дистрибутив

Почему важен -a: -G без него заменяет список групп

-G принимает полный список дополнительных групп, которые должны быть у пользователя. Man-страница говорит об этом прямо: если пользователь сейчас состоит в группе, которой нет в списке, он будет из неё удалён. -a меняет смысл на «добавить эти группы к списку». Разница на практике:

что делает -G без -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 Linux adduser — просто другое имя useradd, и так она не работает. В Alpine форма BusyBox выглядит так: addgroup alice docker.

Как узнать, в каких группах состоит пользователь

любой Linux
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:alice

id 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 и запрос пароля. Затем добавьте группы:

Debian · Ubuntu
sudo adduser alice                 # спросит пароль и необязательные данные
sudo usermod -aG sudo,docker alice

useradd — низкоуровневая утилита, которая есть в любом дистрибутиве. Она умеет задать группы сразу при создании, и здесь -G без -a безопасен: заменять пока нечего. Пароль она не спрашивает, поэтому задайте его или положите SSH-ключ до первого входа:

любой дистрибутив
sudo useradd -m -s /bin/bash -G sudo alice     # в Rocky Linux wheel вместо sudo
sudo passwd alice

useradd и adduser в одном абзаце: в Debian и Ubuntu useradd без ключей не создаёт домашний каталог, ставит оболочку /bin/sh и оставляет пароль заблокированным, поэтому всегда передавайте -m -s /bin/bash и задавайте пароль или ключ. adduser делает всё это сам. В Rocky Linux оба имени ведут к одной программе, а домашний каталог и bash там и так по умолчанию. В обоих семействах новый пользователь обычно получает личную основную группу со своим именем. Выдать учётной записи права администратора, проверить их и закрыть вход для root — отдельная тема, она разобрана в статье о создании пользователя с sudo (англ.).

Как создать группу для общей папки

Отдельная группа — самый аккуратный способ дать нескольким пользователям работать в одном каталоге и не выдать никому из них больше, чем нужно:

любой Linux
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 (англ.).

Как удалить пользователя из группы

любой Linux
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), чтобы сразу включить нового пользователя в группы.

Читайте также

Все статьи раздела

Список пользователей Linux: как вывести всех пользователей и группы и узнать, кто в системе

Как вывести список пользователей Linux и Ubuntu: все учётные записи через getent passwd, только людей по UID, их группы через id и кто сейчас в системе.

SSH-ключ: как создать его командой ssh-keygen и настроить авторизацию по ключу

Как создать SSH-ключ командой ssh-keygen -t ed25519 в Linux, macOS и Windows, скопировать его на сервер и настроить SSH-авторизацию по ключу вместо пароля.

Символическая ссылка в Linux: как создать симлинк командой ln -s, исправить и удалить

Симлинк (символическая ссылка) в Linux указывает на другой путь. Как создать его через ln -s, сменить цель с -sfn, найти битые ссылки и безопасно удалить.

Create a sudo user on Ubuntu, Debian and Rocky Linux, and fix 'is not in the sudoers file'(англ.)

Add a user with adduser, grant sudo through the sudo or wheel group, test it safely and fix 'user is not in the sudoers file' without locking yourself out.

Permission denied while trying to connect to the Docker daemon socket: add your user to the docker group(англ.)

Your user cannot open /var/run/docker.sock. Add it to the docker group safely, fix snap, rootless Docker and CI runners, and why chmod 666 is wrong.