如何在Unix系统中列出特定组的已登录用户?
嘿,我刚接触Unix/Linux的时候也折腾过这个问题,别慌,这几个实用方法能帮你快速筛选出特定组的已登录用户:
方法1:结合who、id和循环筛选
这是最直观的方式,先提取已登录用户,再逐个检查他们的所属组:
who | awk '{print $1}' | sort -u | while read user; do id -nG "$user" | grep -q "你的目标组名" && echo "$user" done
拆解一下每个部分:
who | awk '{print $1}' | sort -u:从who的输出里提取唯一的用户名(避免同一个用户多次登录重复显示)while read user; do ... done:循环处理每一个已登录的用户id -nG "$user":列出该用户所属的所有组的名称(大写G表示显示所有组)grep -q "你的目标组名":静默检查该用户是否属于目标组,匹配成功就输出用户名
方法2:用w命令替代who(可选)
w命令比who显示的信息更全,逻辑和上面一致,只是跳过表头行即可:
w | awk 'NR>1 {print $1}' | sort -u | while read user; do id -nG "$user" | grep -q "你的目标组名" && echo "$user" done
NR>1的作用是跳过w命令输出的第一行表头,直接提取用户名。
方法3:直接解析登录记录文件(进阶)
Unix系统的登录信息存在/var/run/utmp里,可以用utmpdump解析后筛选:
utmpdump /var/run/utmp | awk '{print $4}' | grep -v "^$" | sort -u | while read user; do id -nG "$user" | grep -q "你的目标组名" && echo "$user" done
这里utmpdump会把二进制的utmp文件转成可读格式,$4对应用户名字段,grep -v "^$"用来过滤空行。
小提示
- 记得把命令里的
你的目标组名换成实际要筛选的组,比如wheel或者admin - 不确定组是否存在?可以用
getent group 目标组名先确认组信息 - 这些命令在绝大多数Unix-like系统(比如Ubuntu、CentOS、FreeBSD)都能正常运行
内容的提问来源于stack exchange,提问作者Samun
相关产品推荐
相关产品推荐

