如何将现有用户添加到现有组 ID(而非组名)中?

我想将现有用户foo添加到现有组docker中。问题是我的机器有两个同名的组docker,一个ID为131,另一个为999。我想将foo添加到docker 999组中。以下命令只会将foo添加到131 docker组中:
sudo usermod -aG docker foo

如何将我添加到ID为999的docker组中?
更新:经过进一步查看,我意识到只有docker 131组被列在/etc/group中。
$ cat /etc/group | grep docker
docker:x:131:Steve,Mark,Emmy,user1,foo

我不知道999 docker是从哪里来的,但以下用户可以在没有sudo权限的情况下运行docker:
$ id user1
uid=260800(user1) gid=5000(student) groups=5001(sudoaccess),999(docker),27(sudo),124(sambashare),13010(eestaff),131(docker)

虽然“foo”用户无法:
$ id foo
uid=305800(foo) gid=5000(student) groups=27(sudo),131(docker)

2
  1. 你怎么会有两个同名的群组?
  2. 你可以尝试先备份文件/etc/group,然后使用sudo权限编辑该文件,将用户添加到所需的群组中(在最后一个冒号之后,或者如果已经有其他用户存在,则写一个逗号,然后再添加用户)。你应该能够从其他群组的行中看到这种模式。
- sudodus
@sudodus奇怪地,/etc/group只有docker 131组(问题已更新)。 - Tu Bui
你怎么知道你有一个数字ID为999的用户?这个数字ID在实际系统中用于默认用户。你是如何选择这个数字作为用户ID的?你安装了一些特殊的程序包吗?你正在运行哪个版本的Ubuntu(20.04 LTS还是其他版本)?这是一个实时系统还是已安装的系统? - sudodus
也许999只是被放入那个列表中,以便在实际系统中为默认用户提供功能。请输出grep 131 /etc/group的结果;请编辑您的原始问题,并将输出渲染为code - sudodus
我看到了你的修改。现在(或者在注销/登录或重启后)使用新用户'foo'来运行docker工作了吗? - sudodus
我在评论中看到你正在使用16.04版本,该版本于2016年4月发布,支持截止到2021年4月,所以现在是时候切换到一个受支持的版本了。 - sudodus
2个回答

所以事实证明这是一个XY问题
  1. 问题的陈述(X)“如何将现有用户添加到现有组ID(而不是组名)?”

  2. 实际问题(Y)“如果/etc/group和/etc/gshadow文件在组的数字GID上存在差异,我该怎么办?”


如何将现有用户添加到现有组ID(而不是组名)?
在man页面中没有明确说明,但是usermod命令可以接受数字形式的GID作为参数,用于-g(主组)和-G(附加组)选项。至少在Ubuntu 18.04上测试过。
例如,给定以下示例:
$ groups testuser
testuser : testuser staff

$ getent group ftp
ftp:x:134:

那么

$ sudo usermod -aG 134 testuser

$ groups testuser
testuser : testuser staff ftp

Y. 如果 /etc/group/etc/gshadow 文件在一个组的数字 GID 上存在冲突,我该怎么办?
有一个命令行工具可以解决这个问题,它是作为 passwd 软件包的一部分提供的。
NAME
       grpck - verify integrity of group files

SYNOPSIS
       grpck [options] [group [ shadow ]]

DESCRIPTION
       The grpck command verifies the integrity of the groups information. It
       checks that all entries in /etc/group and /etc/gshadow have the proper
       format and contain valid data. The user is prompted to delete entries
       that are improperly formatted or which have other uncorrectable errors.

       Checks are made to verify that each entry has:

       ·   the correct number of fields

       ·   a unique and valid group name

       ·   a valid group identifier (/etc/group only)

       ·   a valid list of members and administrators

       ·   a corresponding entry in the /etc/gshadow file (respectively
           /etc/group for the gshadow checks)
为了检查不一致性,请首先以只读模式运行。
sudo grpck -r

即使在这里,也需要提升权限,因为 /etc/gshadow 只能被 root 用户读取。一旦您确定了问题所在,再重新运行以交互方式来纠正问题。
sudo grpck

有一个类似的实用程序`pwck`,用于确保`/etc/passwd`和`/etc/shadow`之间的一致性。

不幸的是,在我的情况下(Ubuntu 16.04)它不起作用。我认为这与999 docker不在/etc/group有关。我已经更新了更多信息的问题。 - Tu Bui
1@TuBui 在 /etc/group/etc/gshadow 之间,docker 组的 GID 可能不一致 - 请运行 sudo pwck -r 并将输出添加到您的问题中。 - steeldriver
抱歉,我是说当然是 sudo grpck -r - steeldriver

简而言之,要回答标题的问题,请按照@steeldriver的帖子,也就是说usermod也可以使用组ID。下面的解决方案特别针对OP正文中描述的问题。

显然,通过编辑/etc/group并将docker组ID从131更改为999来解决了这个问题。重新登录后,我只剩下一个docker组 - 999组。

$ id foo
uid=305800(foo) gid=5000(student) groups=27(sudo),999(docker)

我非常希望更改/etc/group不会导致任何奇怪的行为。问题的根源仍然未知(服务器登录也是在LDAP系统下管理的,所以可能两者之间互相干扰)。

3将来,我建议您使用grpck来为您完成这个任务,而不是直接手动编辑文件。 - steeldriver
2对于steeldriver的评论和你自己的担忧,我给一个赞:将'docker'的组ID号更改为999可能会导致一些奇怪的行为。不过,无论如何,如果有必要为其他应用程序进行重置,你总是可以重新设置/etc/group,所以祝你好运 :-) - sudodus