who命令用于显示当前登录用户的基本信息,包括用户名、终端设备(如tty1、pts/0)、登录时间及远程主机地址,不显示进程或cpu使用情况,适合快速确认登录身份与来源。

who 命令显示当前登录用户的基本终端信息
who 是最轻量的查看方式,只输出登录用户名、终端设备(如 tty1、pts/0)、登录时间及远程主机(如果适用)。它不显示进程或 CPU 使用情况,适合快速确认“谁在哪儿登录了”。
常见用法:
-
who:默认输出,字段间用空格分隔,终端名在第二列 -
who -u:附加显示用户空闲时间(单位:小时:分钟)和进程 ID(PID),可用于识别长时间无操作的会话 -
who am i:只显示当前 shell 所属的登录记录(注意am i是字面参数,不是语法糖)
容易踩的坑:who 不显示图形界面中启动的伪终端(如 GNOME Terminal 里的 bash 子进程),它只反映真实的登录会话(即通过 login、sshd 或 getty 建立的 session)。如果你用 su - 切换用户,who 仍显示原始登录用户。
w 命令实时展示用户活动与系统负载
w 在 who 的基础上叠加了每个用户的当前命令、运行时长、CPU 占用,以及系统整体负载(load average)。它本质是 who -u + ps -o pid,tty,time,comm 的组合快照。
关键点:
- 第一行末尾的三个数字是 1/5/15 分钟平均负载,数值 > CPU 核心数时需关注是否过载
- USER 列右侧的
Tty字段和From字段能快速区分本地终端(:0表示 X11 图形会话)、SSH 远程连接(如192.168.1.100)或控制台(console) -
w -h可隐藏表头,方便脚本解析;w -s省略 JCPU/PCPU 和 COMMAND 列,减少宽度
注意:w 默认只显示当前终端可见的用户(受 /proc 权限限制),普通用户可能看不到 root 启动的某些会话;而 root 用户执行 w 能看到全部。另外,w 中的 TIME 是该用户所有进程累计 CPU 时间,不是登录时长。
区分 pts/0、tty1、:0 等终端类型的实际含义
终端标识直接反映登录方式,理解它们才能准确定位用户来源:
-
tty1–tty6:本地虚拟控制台(Ctrl+Alt+F1~F6),通常用于无图形环境或图形崩溃后切换 -
pts/0、pts/1:伪终端从属端(pseudo-terminal slave),几乎全部来自 SSH 登录或 GUI 终端模拟器(如 gnome-terminal) -
:0、:1:X Window 系统显示编号,代表图形会话主进程(如gdm、sddm启动的桌面),并非 shell 终端本身 -
???或空白FROM字段:可能是本地登录但未设置HOSTNAME,或终端设备信息被截断
一个典型线索:who 输出中某用户 TTY 是 pts/2,而 FROM 是 10.0.2.2,基本可断定是 VirtualBox 宿主机通过 SSH 连入;若 TTY 是 tty2 且无 FROM,大概率是物理机上手动切换过去的字符界面。
当 who/w 没有返回预期用户时该查什么
如果已知有人登录但 who 或 w 没出现,别急着怀疑命令失效——更可能是会话未经过标准登录流程:
- 检查
loginctl list-sessions:systemd 环境下,who不显示非 PAM 登录的 session(如某些容器内启动的 bash),但loginctl能列出所有session-*.scope - 运行
ps -eo user,tty,cmd --no-headers | grep -v "?" | sort -u:绕过登录记录,直接扫进程的tty字段,可捕获sudo -i、docker exec -it等场景下的活跃 shell - 查看
/var/run/utmp是否被清空或损坏:这两个命令都依赖它,若被误删或权限错误(应为644且属root:utmp),输出就会异常精简
真正难排查的是那些不写 utmp 的程序——比如用 setsid bash 启动的脱离会话的 shell,它连 ps 都不一定出现在用户进程树里,这时候得靠 lsof -u username 或审计日志 ausearch -m USER_LOGIN -i(需提前启用 auditd)。











