lid -g groupname 不起作用,因其 -g 选项在多数现代系统中已弃用或行为不一致;推荐用 getent group groupname | cut -d: -f4 提取显式成员。

lid 命令本身并不直接支持“按组名列出所有成员”,它默认是根据用户(而非组)来查询其所属的组。所以想用 lid 快速列出指定用户组的所有成员,需要配合其他命令或换用更合适的工具。
为什么 lid -g groupname 不起作用?
lid 的 -g 选项实际是用于显示某个组的 GID 和该组所属的用户(即反向查成员),但它的行为在不同系统上不一致:部分旧版或非 GNU 系统中 lid -g groupname 可能报错或无输出;现代多数发行版(如 Debian/Ubuntu)已弃用该用法,或仅支持 lid username 形式。
推荐替代方案:用 getent 或 compgen
更可靠、通用的方法是使用系统自带的命令组合:
-
getent group groupname | cut -d: -f4:从/etc/group或 NSS 数据源中提取指定组的成员字段(第4段),以逗号分隔;若为空表示无额外成员(仅含同名用户) -
getent group groupname | awk -F: '{print $4}' | tr ',' '\n' | grep -v "^$":进一步将逗号分隔的成员转为每行一个,过滤空行 -
compgen -g | grep "^groupname$" && getent group groupname | cut -d: -f4 | tr ',' '\n':先确认组存在,再提取成员
注意:/etc/group 中的“隐含成员”
Linux 组成员关系分两类:
- 显式列出在 /etc/group 第4字段的用户(如 <code>sudo:x:27:alice,bob)
- 用户主组(primary group)不会出现在该字段,但该用户仍属于该组。例如用户 charlie 主组是 dev,但 /etc/group 中 dev 行可能不包含 charlie —— 这类成员需用 getent passwd | awk -F: '$4 == GID {print $1}' 配合 getent group groupname | cut -d: -f3 查 GID 后筛选,一般管理场景中不常需要
如果坚持用 lid,可间接实现
只能遍历所有用户,逐个检查是否属于目标组(低效,仅适合小规模环境):
for u in $(getent passwd | cut -d: -f1); do lid "$u" 2>/dev/null | grep -q 'groupname'; [ $? -eq 0 ] && echo "$u"; done- 更稳妥写法:
getent passwd | cut -d: -f1 | xargs -I{} sh -c 'lid {} 2>/dev/null | grep -q "groupname:" && echo {}'
该方式依赖 lid 输出格式(通常为 user_name(uid): groups: group1(gid1) group2(gid2)...),且性能随用户数增长明显下降,不建议生产环境使用。
真正快速、标准的做法是用 getent group groupname 解析第4字段,配合文本处理即可。lid 并非为此设计,强行使用反而绕路。











