一、命令简介
who命令是 Linux 系统中用于显示当前登录到系统的用户信息的标准命令。它可以显示用户名、登录终端、登录时间、来源 IP 地址等关键信息,是系统管理员进行用户监控和安全管理的重要工具。
二、基本语法
who [选项] [文件]
权限要求:所有用户均可使用 who 命令,无需特殊权限。 核心原理:who 命令通过解析 /var/run/utmp文件(二进制文件,存储当前活跃的登录会话信息)来获取用户登录数据。
三、常用选项详解
| 选项 | 说明 | 示例 |
|---|---|---|
-a, --all | 显示所有信息(相当于 -b -d -l -p -r -t -T -u 的组合) | who -a |
-b, --boot | 显示系统最近一次启动时间 | who -b |
-d, --dead | 显示已终止但未清理的会话(”僵尸”进程) | who -d |
-H, --heading | 在输出中添加列标题(提升可读性) | who -H -u |
-l, --login | 显示当前正在等待登录的进程 | who -l |
-m | 仅显示当前用户的会话(等同于 who am i) | who -m |
-q, --count | 快速显示登录用户数及用户名列表 | who -q |
-r, --runlevel | 显示当前系统运行级别(仅 SysV 系统) | who -r |
-s, --short | 默认选项,显示简短格式(用户名、终端、登录时间) | who -s |
-t, --time | 显示系统时钟最近一次修改时间 | who -t |
-u, --users | 显示用户空闲时间(. 表示活跃,old 表示超过 24 小时) | who -u |
-w, -T, --mesg | 显示用户终端的消息状态(+ 允许写入,- 禁止写入,? 状态未知) | who -T |
四、输出字段解释
who 命令的输出包含以下关键字段:
| 字段 | 说明 |
|---|---|
| 用户名 | 登录系统的用户账户名 |
| 终端类型 | tty(物理终端)或 pts(伪终端,通常对应 SSH 或图形界面终端) |
| 登录时间 | 用户登录系统的具体时间(格式:YYYY-MM-DD HH:MM) |
| 来源 IP | 远程登录的 IP 地址(本地登录显示 :0 或不显示) |
| 空闲时间 | 用户最后一次操作后的空闲时间(. 表示当前活跃,H:MM 格式) |
| 进程 ID | 登录会话对应的进程 ID |
| 消息状态 | +(允许接收消息),-(禁止接收消息),?(状态未知) |
五、实际应用场景
1. 查看当前登录用户(默认输出)
who
输出示例:
alice pts/0 2023-10-01 09:30 (192.168.1.100)
bob tty1 2023-10-01 08:15
charlie pts/1 2023-10-01 10:05 (192.168.1.102)
2. 显示带标题的详细信息
who -H -u
输出示例:
NAME LINE TIME IDLE PID COMMENT
alice pts/0 2023-10-01 09:30 . 1234 (192.168.1.100)
bob tty1 2023-10-01 08:15 1:20 5678
3. 仅显示当前用户的会话
who -m
# 或
who am i
用途:快速确认自己的登录终端和 IP,排查网络问题。
4. 查看系统启动时间
who -b
输出示例:
system boot 2023-09-30 18:00
用途:排查系统是否意外重启。
5. 统计登录用户数量及列表
who -q
输出示例:
users=3 alice bob charlie
用途:快速了解系统当前负载。
6. 查看用户消息状态
who -T
输出示例:
+ alice pts/0 2023-10-01 09:30 (192.168.1.100)
- bob tty1 2023-10-01 08:15
? charlie pts/1 2023-10-01 10:05 (192.168.1.102)
解释:+ 表示终端允许接收消息(可通过 write 命令发送消息),- 表示禁止,? 表示无法确定状态。
六、常见实践场景
场景 1:日常系统状态检查
管理员每天登录系统后,可通过 who -H -u快速查看活跃用户、终端、登录时间及空闲状态,判断是否有异常登录(如陌生 IP、非工作时间登录)。
场景 2:监控长时间空闲用户
# 查找空闲时间超过 2 小时的用户
who -u | awk '$5 ~ /^[0-9]+:[0-9]5 > "02:00") {print "Idle user: " $0}'
用途:清理资源或提醒长时间未操作的用户。
场景 3:脚本中记录活跃用户
# 每天 23:00 将活跃用户日志写入文件
echo "[$(date)] Active users: $(who -q | awk '{print $2}')" >> /var/log/user_activity.log
用途:分析系统使用规律。
场景 4:排查登录故障
who -l
正常输出(每个 tty 对应一个 getty 进程):
LOGIN tty2 2023-10-01 08:00 789 id=tty2
LOGIN tty3 2023-10-01 08:00 790 id=tty3
异常:若某 tty 缺失,可能是 getty 服务未启动,需重启 systemd-logind 或 systemctl getty@tty2。
七、最佳实践
- 优先使用 -H 提升可读性:输出添加标题后,列含义更清晰,适合新手或多列输出场景。
- 按需选择选项,避免冗余:若仅需用户列表,使用
who -q而非who -a(后者加载更多数据,速度较慢)。 - 注意 /var/run/utmp 权限:普通用户可读取,但修改需 root 权限。若 who 无输出,可能是文件损坏或权限错误(修复:
sudo chmod 644 /var/run/utmp)。 - 结合管道命令增强过滤能力:
# 仅显示远程登录用户(pts 终端且带 IP)
who | grep 'pts/[0-9]\+.*([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+)'
# 按登录时间排序用户(oldest 优先)
who -u | sort -k3,4
八、高级用法
1. 自定义登录记录文件
# 读取自定义 utmp 文件
who /path/to/custom/utmp
注意:实际中极少使用,因 utmp 仅存储当前会话。
2. 结合 awk 实现复杂统计
# 统计每个用户的登录会话数
who | awk '{count[$1]++} END {for (user in count) print user ": " count[user] " sessions"}'
输出示例:
alice: 2 sessions
bob: 1 session
九、与类似命令的区别
| 命令 | 特点对比 |
|---|---|
| who | 基础登录信息(用户、终端、时间),轻量快速,支持多种过滤选项 |
| w | 更详细:包含系统负载、用户进程数、CPU/内存占用(who + ps 简化版) |
| users | 极简:仅输出用户名列表(无终端/时间,适合快速统计) |
| finger | 显示用户详细信息(如全名、邮箱、登录目录),但需额外安装且安全性较低 |
十、总结
who命令是 Linux 系统中查看用户登录状态的”瑞士军刀”,虽基础但功能灵活。通过掌握其核心选项(如 -H、-u、-b、-q),可轻松完成日常监控、用户管理和故障排查任务。无论是系统管理员还是普通用户,熟练使用 who 都能显著提升对系统状态的掌控力。