最直接可靠的方式是使用 w -h -u 命令,它读取 /var/run/utmp,只显示真实活跃会话(ssh、tty、图形登录),不包含已断开但残留的“幽灵连接”。

最直接、可靠的方式是使用 w -h -u 命令,它读取 /var/run/utmp,只显示真实活跃会话(SSH、TTY、图形登录),不包含已断开但残留的“幽灵连接”。
推荐首选:w -h -u
默认 w 输出容易被截断(尤其用户名或命令过长),且 JCPU/PCPU 计算可能因权限不足报错,掩盖真实用户。加 -h 去表头、-u 禁用 CPU 时间计算后,输出干净稳定:
- 第一列是用户名
- 第二列是终端(如
pts/0、tty1、:0) -
FROM列为???通常是 SSH 反向 DNS 解析失败,不影响判断是否在线
按登录时间排序?用 last | grep "still logged in"
w 默认按 CPU 占用排序,若需按登录先后查看,应改用:
-
last | grep "still logged in"—— 准确列出当前仍处于活跃状态的会话 - 每行含用户名、终端、来源 IP、登录起始时间,信息完整可审计
脚本中快速提取用户名:优先用 who
who 字段固定、无歧义,适合解析;users 虽简洁,但同一用户多终端会重复出现,且无法区分来源或终端类型:
- 提取所有登录用户名(含重复):
who | awk '{print $1}' - 去重统计实际登录人数:
who | awk '{print $1}' | sort -u | wc -l -
who am i只显示当前 shell 所属会话,不适合全局统计
别漏掉图形界面用户:loginctl 必须补上
GNOME/KDE 桌面通过 systemd-logind 管理会话。w 和 who 虽能显示 :0 或 tty7,但无法确认会话是否活跃:
- 列出所有用户会话:
loginctl list-sessions - 查某用户所有会话:
loginctl list-sessions | grep username - 确认会话是否 active:
loginctl show-session <session-id> | grep Active</session-id> - 普通用户权限即可运行,无需 root











