在RHEL上,有一个命令lid
,可以列出组用户,无论是主组还是次要组。
[root@192 ~]# id user1
uid=1000(user1) gid=1000(user1) groups=1000(user1),1001(g1)
[root@192 ~]# id user2
uid=1001(user2) gid=1002(user2) groups=1002(user2),1001(g1)
[root@192 ~]# id user3
uid=1002(user3) gid=1001(g1) groups=1001(g1)
[root@192 ~]# lid -g g1
user3(uid=1002)
user1(uid=1000)
user2(uid=1001)
[root@192 ~]#
但它在 Ubuntu 上不存在。有类似的吗?
答案1
它确实存在于 Ubuntu 中,但以不同的名称提供:
sudo libuser-lid -g g1
它是软件包的一部分libuser
,如有必要请安装:
sudo apt install libuser
它没有命名的原因lid
是lid
在id-utils
包并有不同的目的。
答案2
可以使用标准实用程序来实现所描述的功能:
for u in $(getent group | grep '^g1:' | cut -d: -f4 | tr , '\n'); do
printf "%s(uid=%d)\n" $u $(id -u "$u")
done
更新:命令:
getent passwd | grep -E '^([^:]+:){3}'$(getent group | grep '^g1:' | cut -d: -f3)':' | cut -d: -f1
将从 /etc/passwd 中检索与主要组为 的用户相对应的行g1
。这可以与前面的命令结合使用:
for u in $({ getent passwd | grep -E '^([^:]+:){3}'$(getent group | \
grep '^g1:' | cut -d: -f3)':' | cut -d: -f1; \
getent group | grep '^g1:' | cut -d: -f4 | tr , '\n'; }); do
printf "%s(uid=%d)\n" $u $(id -u "$u")
done | sort | uniq
最后添加排序和删除重复项。
为了方便起见,可以将该命令做成shell函数,使用组名作为参数:
lid_replacement()
{
for u in $({ getent passwd | grep -E '^([^:]+:){3}'$(getent group | \
grep '^'$1':' | cut -d: -f3)':' | cut -d: -f1; \
getent group | grep '^'$1':' | cut -d: -f4 | tr , '\n'; }); do
printf "%s(uid=%d)\n" $u $(id -u "$u")
done | sort | uniq
}
# call as: `lid_replacement g1`
编辑:更新了正则表达式以匹配确切的组名称。
编辑2:更新为使用 getent(1) 并添加了函数lid_replacement
。