users命令直接输出空格分隔的当前登录用户名列表,统计的是活跃会话而非用户账号,故同一用户名多次出现表示该用户有多个终端会话;其数据源为/var/run/utmp,不显示ip、不自动去重、不覆盖wayland/x11等无utmp记录的会话。

直接用 users 命令就能拿到空格分隔的当前登录用户名列表,但要注意它不区分终端、不自动去重、也不显示远程 IP —— 它只做一件事:从 /var/run/utmp 里把所有活跃会话的用户名拉出来,原样拼成一行。
为什么 users 输出里同一个名字出现多次?
因为 users 统计的是「登录会话」,不是「用户账号」。一个用户开两个 SSH 窗口,就会在 /var/run/utmp 中留下两条记录,users 就输出两次该用户名。
- 常见现象:
users输出alice alice bob,说明 alice 有两个活跃终端(比如 pts/0 和 pts/1),bob 有一个 - 这和
who的行为一致,但who每行一条会话,而users全压成一行 - 如果你要统计“不同用户数”,不能直接
wc -w,得先拆分去重:users | tr ' ' '\n' | sort -u | wc -l
users 和 who、w 的核心区别在哪?
三者都读 /var/run/utmp,但输出粒度和用途完全不同:
-
users:纯用户名列表,无格式、无换行、无额外字段,适合管道后续处理(如进脚本判断是否存在某用户) -
who:每行一个会话,含终端(pts/0)、登录时间、来源 IP(括号内),适合人工快速扫一眼谁从哪来 -
w:最全,除了who的信息,还带空闲时间、CPU 占用、当前命令,顶部还有系统负载 —— 但第一行末尾的 “3 users” 是会话总数,不是用户数
别用 ps aux | grep sshd | wc -l 代替 —— 一个 sshd 进程不一定对应一个登录用户(比如 pre-auth 阶段、连接复用),而且漏掉本地 tty 和图形会话。
systemd 系统下,users 会漏掉哪些人?
在 Ubuntu 22.04+、CentOS 8+ 等 systemd 发行版中,users 只能捕获有 utmp 记录的会话(SSH、本地终端、传统图形登录)。它看不到:
- Wayland 或 X11 图形界面下的用户会话(除非显式写入 utmp)
- 通过
machinectl启动的容器会话 - 某些桌面环境(如 GNOME)后台启动的无终端 session
这时得用 loginctl list-sessions --no-legend | wc -l 查总会话数,或 loginctl list-users --no-legend | wc -l 查真实不同用户数 —— 但注意,loginctl 需要 D-Bus 权限,普通用户可能需加 sudo,而 root 会话是否应计入得看你的监控目标。
真正容易被忽略的点是:没有哪个单一命令能 100% 覆盖所有登录形态。users 简洁可靠,但它的“当前登录用户列表”本质上只是 /var/run/utmp 的快照 —— 如果这个文件权限不对、被截断、或系统禁用了 utmp 记录(如某些容器镜像),它就返回空,而不是报错。











