Os nomes de usuário que contêm espaços não são permitidos por padrão no Ubuntu, portanto, esse método deve ser robusto:
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
: imprime a lista de usuários atualmente conectados; -
cut -d ' ' -f 1
: imprime o primeiro campo separado por espaço de cada linha; -
while read user; do for gid in $(id -G "$user"); do [ $gid -eq $(id -g) ] && printf '%s\n' "$user" && break; done; done
: para cada usuário, verifica se um dos IDs do grupo do usuário atual é o mesmo do usuário que está executando o comando; se for, imprime o usuário; -
sort -u
: classifica os usuários e remove os possíveis duplicados.
% 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