Linux常用命令学习笔记:who

一、命令简介

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 iwho -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

七、最佳实践

  1. 优先使用 -H 提升可读性:输出添加标题后,列含义更清晰,适合新手或多列输出场景。
  2. 按需选择选项,避免冗余:若仅需用户列表,使用 who -q而非 who -a(后者加载更多数据,速度较慢)。
  3. 注意 /var/run/utmp 权限:普通用户可读取,但修改需 root 权限。若 who 无输出,可能是文件损坏或权限错误(修复:sudo chmod 644 /var/run/utmp)。
  4. 结合管道命令增强过滤能力
# 仅显示远程登录用户(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 都能显著提升对系统状态的掌控力。


作 者:南烛
链 接:https://www.itnotes.top/archives/651
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇