列出已登录用户的群组

我知道可以使用who命令查看已登录用户的列表。 但是假设我想要查看我的组中有哪些人已登录,我该怎么做呢?
1个回答

默认情况下,在Ubuntu上不允许使用带有空格的用户名,因此这种方法应该是可靠的:
who | cut -d ' ' -f 1 | while read user; do for gid in $(id -G "$user"); do [ $gid -eq $(id -g) ] && printf '%s\n' "$user" && break; done; done | sort -u
  • who:打印当前登录用户列表;
  • cut -d' ' -f 1:打印每行的第一个以空格分隔的字段;
  • while read user; do for gid in $(id -G "$user"); do [ $gid -eq $(id -g) ] && printf '%s\n' "$user" && break; done; done:对于每个用户,检查当前用户的组ID之一是否与运行命令的用户相同;如果是,则打印用户;
  • sort -u:对用户进行排序并删除可能存在的重复。
% whoami
user
% who                     
foo      tty1         2016-01-27 16:49
user     tty2         2016-01-24 21:26 (:1)
user     pts/2        2016-01-27 16:33 (:1)
user     pts/4        2016-01-27 16:48 (:1)
% getent group user    
user:x:1000:
% who | cut -d ' ' -f 1 | while read user; do for gid in $(id -G "$user"); do [ $gid -eq $(id -g) ] && printf '%s\n' "$user" && break; done; done | sort -u
user
% sudo usermod -aG user foo
% who | cut -d ' ' -f 1 | while read user; do for gid in $(id -G "$user"); do [ $gid -eq $(id -g) ] && printf '%s\n' "$user" && break; done; done | sort -u
foo
user

顺便问一下,foo是什么意思? - juggernauthk108
@juggernaut1996 只是一个我用来测试一些太危险无法在我的主要账户上测试的用户。 - kos
好的政策,但是我预期会得到一个更加通用的回答... 我在很多地方看到这个词出现... 在Linux中它有特殊的含义吗?我在某个地方读到它只是一个变量.. 我的理解正确吗? - juggernauthk108
1@juggernaut1996确实如此,但不仅限于Linux。请参阅此处:https://zh.wikipedia.org/wiki/Foobar - kos
我之前不知道$id,真的很方便。 - j0h