A service refuses to read a shared file, and you are about to find out what /etc/group actually stores. This guide creates a Linux group, adds one existing user to it, and confirms the result without guessing what is stored in /etc/group. Allow about 10 minutes. You need an account with sudo access, the username and group name you intend to use, and a reason for the membership.
This guide describes the local format documented by Linux man-pages 6.7, installed here through Debian's manpages package version 6.7-2. Account databases can also come from services such as LDAP or NIS, so a line in the local file is not always the complete answer.
Replace GROUP_NAME with the group you are investigating. This is an ordinary command, so it needs no elevated privileges:
getent group GROUP_NAME
A local entry has four colon-separated fields:
group_name:password:GID:user_list
Do not treat an empty final field as proof nobody can use the group: a user may have it as their primary group, or membership may come from another configured database. Trust the name service view from getent, then check a specific account with id.
Checkpoint: record the starting state before you change anything, so a confusing result later has something to compare against:
getent group GROUP_NAME
id USER_NAME
Use groupadd rather than typing a new line into /etc/group by hand. It picks an available GID from the local account defaults and updates the account files with the locking that a manual edit would skip. Creating a group changes system state and needs sudo:
sudo groupadd PROJECT_READERS
Group names on this Debian system cannot contain a colon, comma or whitespace, and cannot start with a dash. A successful groupadd normally prints nothing, so confirm both the name and the assigned ID yourself:
getent group PROJECT_READERS
Expect a line shaped like this, with a machine-chosen number and usually an empty member list:
PROJECT_READERS:!:1050:
The exact GID and password marker are system-specific. Do not copy this line back into a file, and do not assume the marker means the same thing in every account backend.
Use the append form of usermod. The -a is not optional: without it, -G replaces the user's entire supplementary-group list with the one you give it, which is a common and genuinely disruptive mistake.
sudo usermod --append --groups PROJECT_READERS USER_NAME
Check both the database and the account view:
getent group PROJECT_READERS
id USER_NAME
The group entry should now list USER_NAME, and the id output should include PROJECT_READERS with its GID. If the user is already logged in, their running shell and processes may still hold the old supplementary-group list. Have them start a new login session, or use newgrp PROJECT_READERS where that suits the workflow, then verify inside that new session:
id -nG
Checkpoint: membership only matters once a file or service actually grants access to the group, so test a real, non-sensitive target that is already meant to be shared:
stat -c '%A %U %G %n' /path/to/shared-file
The group shown by stat must be PROJECT_READERS, and the group permission bits must grant the operation you expect. Adding a user to a group changes nothing about file ownership or permission bits by itself.
Removing a member is also a privileged, state-changing operation. Capture the current list first, because the replacement list you give usermod must preserve every other supplementary group:
id -nG USER_NAME
getent group PROJECT_READERS
Then remove the named group while keeping the rest. Replace OTHER_GROUP_1,OTHER_GROUP_2 with the groups that should remain; do not paste this example unchanged:
sudo usermod --groups OTHER_GROUP_1,OTHER_GROUP_2 USER_NAME
Run id USER_NAME again. If you accidentally dropped a group, restore the intended complete list with usermod --groups, or add back the one missing group with the safe append form from step 3.
Most changes should go through groupadd, usermod or another account-management tool. If a documented recovery procedure genuinely requires editing the group database itself, use vigr, not a text editor opened straight on /etc/group: vigr takes the lock needed to prevent concurrent corruption.
sudo vigr
VISUAL or EDITOR first if you need a particular editor.getent group GROUP_NAME shows the intended group from the configured account database.id USER_NAME shows the intended membership and GID.