w -h -u 命令最准确显示当前活跃用户会话,读取 /var/run/utmp,排除僵尸连接,列明用户名、终端、来源及空闲时间;who 适合脚本提取登录信息;loginctl 专用于 systemd 图形会话管理;ps aux | grep sshd 不可靠,易误判。

直接用 w -h -u 命令就能看到当前所有活动用户会话,它最全也最准——不光列人名,还告诉你谁在哪儿登录、在干什么、空闲多久。
用 w 查实时会话状态
w 读取的是 /var/run/utmp,只显示真正活跃的会话(SSH、TTY、图形界面),不会把断连没清理的“僵尸连接”算进来。默认输出带系统负载摘要和表头,容易被截断;加 -h 去掉表头,-u 避免因权限问题卡住:
- 第一列是用户名
- 第二列是终端,比如 pts/0(SSH)、tty1(物理控制台)、:0(本地图形界面)
- 第三列是来源::0 表示本地桌面,IP 地址表示远程 SSH 登录
- FROM 列出现 ??? 是反向 DNS 解析失败,不影响判断是否在线
- 注意:w 默认按 CPU 使用率排序,刚登录但没干活的用户可能被压到后面;想看谁先登的,得换 who 或 last
用 who 快速确认登录上下文
who 输出字段固定、无进程干扰,适合脚本提取或排查来源:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 格式统一为:用户名 + 终端 + 登录时间 + 来源 IP(空表示本地)
- 查某个用户是否在线:who | grep 'alice'
- 导出唯一用户名列表:who | awk '{print $1}' | sort -u
- 别误把 users 当去重工具——它原样反映多终端登录,比如 root 开了两个终端,就会出现两次 root
图形界面用户不能只靠 w 和 who
GNOME、KDE 等桌面环境由 systemd-logind 管理,w 和 who 虽能显示 :0 或 tty7,但有时只显示 gdm 或 lightdm,不显示真实用户名:
- 列出所有用户会话:loginctl list-users
- 查某用户的会话详情:loginctl show-user alice
- 确认图形会话是否活跃:loginctl session-status,看 State=active 且 Type=wayland 或 x11
- 注意:loginctl 在非 systemd 系统(如某些 Alpine 容器)不可用,此时只能依赖 w 的 :0 提示
别用 ps aux | grep sshd 替代
看似能数 SSH 进程,实际错漏百出:
- sshd 子进程 UID 不一定等于登录用户 UID(ForceCommand、容器化 SSH 场景下常见)
- 网络中断后未清理的僵死连接仍留在 ps 里,但 w 已剔除
- systemd --user 会话、Wayland compositor 启动的 GUI 用户完全不出现在 ps 的 sshd 列表中
- 真实情况:ps 显示 5 个 sshd,w 只有 2 个用户——另外 3 个是该 kill 没 kill 干净的残留










