Linux查看登陆用户信息:w与who命令深度解析
作为Linux系统管理员,监控用户登录状态是日常运维的核心任务之一——无论是排查资源占用、准备系统维护,还是进行安全审计,都需要快速掌握当前活跃用户的信息。在Linux中,w和who是两个最常用的工具:w命令提供详细的用户活动与系统状态,who则专注于快速查询登录会话基本信息。
本文将从基础概念入手,深入解析两个命令的输出、选项与最佳实践,并通过实际场景演示如何高效使用它们。无论你是Linux新手还是资深管理员,都能从中找到实用的技巧。
目录#
- 基础概念:登录会话与用户状态
- TTY与PTS:终端类型解析
- utmp/wtmp:用户会话数据来源
- w命令:详细查看活跃用户与系统状态
- 默认输出深度解析
- 常用选项与示例(-h/-u/-s/-i等)
- who命令:快速查询用户登录信息
- 默认输出解析
- 关键选项与示例(-a/-b/-m/-q等)
- w vs who:何时选择哪个命令?
- 最佳实践:高效使用技巧
- 常见场景实战:解决实际问题
- 总结
- 参考资料
1. 基础概念:登录会话与用户状态#
在深入命令之前,先明确两个核心概念——终端类型和用户会话数据存储,这是理解w/who输出的关键。
1.1 TTY与PTS:终端类型解析#
Linux中,用户通过**终端(Terminal)**与系统交互,终端分为两类:
| 类型 | 全称 | 说明 | 示例 |
|---|---|---|---|
| TTY | Teletypewriter(电传打字机) | 物理终端(如服务器本地控制台) | tty1(第一个物理终端) |
| PTS | Pseudoterminal Slave(伪终端从设备) | 虚拟终端(如SSH会话、GNOME终端) | pts/0(第一个伪终端) |
如何区分?
- TTY的
FROM列(w命令中)为空(本地登录); - PTS的
FROM列显示远程IP或主机名(如192.168.1.100)。
1.2 utmp/wtmp:用户会话数据来源#
w和who的信息均来自**/var/run/utmp文件——它存储当前活跃的用户会话**(如登录、终端连接)。而历史会话(已注销用户)则保存在/var/log/wtmp(需用last命令查询)。
2. w命令:详细查看活跃用户与系统状态#
w命令的核心价值是将用户活动与系统状态结合展示——不仅能看到谁在登录,还能知道他们在做什么、占用了多少资源。
2.1 w命令概述#
作用:显示当前活跃用户、终端信息、系统负载及用户当前运行的命令。
语法:w [选项] [用户名]
示例默认输出:
14:35:22 up 10 days, 2:17, 4 users, load average: 0.12, 0.09, 0.07
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 08:00 6:35m 0.05s 0.05s -bash
jane pts/0 10.0.0.5 09:15 0.00s 0.23s 0.00s w
john pts/1 10.0.0.7 10:30 45m 0.10s 0.10s vim report.txt
admin pts/2 10.0.0.12 14:00 0.00s 0.08s 0.08s top2.2 默认输出深度解析#
输出分为系统状态行和用户信息表两部分:
(1)系统状态行(第一行)#
| 字段 | 说明 | 示例 |
|---|---|---|
14:35:22 | 当前系统时间 | - |
up 10 days, 2:17 | 系统运行时间 | 已开机10天2小时17分钟 |
4 users | 当前活跃用户数 | - |
load average: 0.12, 0.09, 0.07 | 系统负载(1/5/15分钟平均) | 数值越低,系统越空闲 |
(2)用户信息表#
| 列名 | 说明 | 示例 |
|---|---|---|
USER | 用户名 | root |
TTY | 终端设备名 | tty1/pts/0 |
FROM | 远程登录源(本地会话为空) | 10.0.0.5(SSH客户端IP) |
LOGIN@ | 登录时间 | 08:00 |
IDLE | 空闲时间(自上次输入以来的时间) | 6:35m(6小时35分钟) |
JCPU | 该终端所有进程的总CPU时间 | 0.23s |
PCPU | 当前进程(WHAT列)的CPU时间 | 0.00s(w命令本身) |
WHAT | 用户当前运行的命令 | vim report.txt |
2.3 常用选项与示例#
w的选项主要用于简化输出或增加细节,以下是高频选项:
(1)-h:隐藏表头#
适合脚本解析或需要简洁输出的场景:
$ w -h
root tty1 08:00 6:35m 0.05s 0.05s -bash
jane pts/0 10.0.0.5 09:15 0.00s 0.23s 0.00s w
john pts/1 10.0.0.7 10:30 45m 0.10s 0.10s vim report.txt(2)-u:显示更精确的空闲时间#
将空闲时间从**“分钟”改为“分钟+秒”**,适合短时间空闲的场景:
$ w -u
14:40:00 up 10 days, 2:22, 4 users, load average: 0.08, 0.07, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 08:00 395:00 0.05s 0.05s -bash
jane pts/0 10.0.0.5 09:15 0.00s 0.23s 0.00s w -u注意:
IDLE列变为395:00(395分钟,即6小时35分钟)。
(3)-s:简洁输出模式#
隐藏LOGIN@、JCPU、PCPU列,仅保留核心信息:
$ w -s
14:42:15 up 10 days, 2:24, 4 users, load average: 0.05, 0.06, 0.06
USER TTY FROM IDLE WHAT
root tty1 6:37m -bash
jane pts/0 10.0.0.5 0.00s w -s
john pts/1 10.0.0.7 47:00 vim report.txt(4)-i:以HH:MM格式显示空闲时间#
默认IDLE用m(分钟)或s(秒)表示,-i将长空闲时间转为小时:分钟,更易读:
$ w -i
14:45:00 up 10 days, 2:27, 4 users, load average: 0.03, 0.05, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 08:00 06:38 0.05s 0.05s -bash
jane pts/0 10.0.0.5 09:15 00:00 0.23s 0.00s w -i
IDLE列从6:38m变为06:38(6小时38分钟)。
(5)-w:显示终端可写状态#
-w会在TTY列后增加终端状态标记:
+:终端可写(允许write命令发送消息);-:终端不可写;?:状态未知。
示例:
$ w -w
14:47:30 up 10 days, 2:29, 4 users, load average: 0.02, 0.04, 0.05
USER TTY WR FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 08:00 6:47m 0.05s 0.05s -bash
jane pts/0 + 10.0.0.5 09:15 0.00s 0.23s 0.00s w -w3. who命令:快速查询用户登录信息#
who的设计目标是快速获取登录会话的核心信息,输出比w更简洁,适合快速统计或查看基础属性。
3.1 who命令概述#
作用:显示当前登录用户的基本信息(用户名、终端、登录时间、远程源)。
语法:who [选项] [文件]
默认输出:
$ who
root tty1 2024-05-20 08:00
jane pts/0 2024-05-20 09:15 (10.0.0.5)
john pts/1 2024-05-20 10:30 (10.0.0.7)
admin pts/2 2024-05-20 14:00 (10.0.0.12)3.2 默认输出解析#
| 列名 | 说明 | 示例 |
|---|---|---|
NAME | 用户名 | root |
LINE | 终端设备名 | tty1/pts/0 |
TIME | 登录时间(完整格式) | 2024-05-20 08:00 |
COMMENT | 备注(远程登录源或终端类型) | (10.0.0.5) |
3.3 关键选项与示例#
who的选项专注于扩展信息维度(如系统启动时间、终端状态),以下是实用选项:
(1)-a:显示所有可用信息#
-a(all)会整合utmp中的所有字段,包括系统启动时间、运行级别、已终止会话,适合全面排查:
$ who -a
system boot 2024-05-10 06:00
runlevel 5 2024-05-10 06:01
LOGIN tty1 2024-05-20 08:00 1234 id=1
root tty1 2024-05-20 08:00 6:47 1234
jane pts/0 2024-05-20 09:15 . 2345 (10.0.0.5)
john pts/1 2024-05-20 10:30 49:00 3456 (10.0.0.7)
admin pts/2 2024-05-20 14:00 . 4567 (10.0.0.12)
pts/3 2024-05-20 13:00 1:47 5678 dead字段说明:
system boot:系统最后启动时间;runlevel:当前运行级别(5为图形界面);LOGIN:登录进程(等待输入用户名的状态);dead:已终止的会话。
(2)-b:查看系统最后启动时间#
快速获取系统 uptime 的另一种方式:
$ who -b
system boot 2024-05-10 06:00(3)-m:仅显示当前用户会话#
等价于who am i或who mom likes(彩蛋命令),适合确认自己的登录状态:
$ who -m
jane pts/0 2024-05-20 09:15 (10.0.0.5)(4)-q:快速统计用户数量#
输出用户列表和总人数,适合快速检查活跃用户数:
$ who -q
root jane john admin
# users=4(5)-T:显示终端读写状态#
与w -w类似,-T在用户名后添加终端状态标记:
$ who -T
root + tty1 2024-05-20 08:00
jane + pts/0 2024-05-20 09:15 (10.0.0.5)
john - pts/1 2024-05-20 10:30 (10.0.0.7)
+:可写;-:不可写。
4. w vs who:何时选择哪个命令?#
| 场景 | 选w还是who? | 原因 |
|---|---|---|
| 需要知道用户当前运行的命令或CPU占用 | w | w的WHAT/JCPU/PCPU列提供详细活动信息 |
| 需要快速统计用户数或查看启动时间 | who | who -q/who -b更简洁 |
| 需要脚本解析输出 | w -h或who -q | 无表头/简洁格式更易处理 |
| 需要全面排查会话状态(如dead会话、登录进程) | who -a | who -a整合了所有utmp信息 |
5. 最佳实践:高效使用技巧#
(1)非侵入式检查:避免干扰用户#
- 用
w查看用户活动时,不要直接终止他们的进程(除非紧急); - 如需提醒用户,用
write命令(需终端可写,即+状态):$ write jane pts/0 Hello Jane, system maintenance at 20:00. Please save your work!
(2)结合其他命令:扩展分析能力#
- 排查高CPU用户:
w找到高PCPU的用户 →ps -u <user>查看其进程; - 查看历史登录:
who看当前会话 →last看历史会话; - 终止空闲会话:
w -i找到空闲超过1小时的用户 →pkill -9 -t <tty>(如pkill -9 -t pts/1)。
(3)定期监控:用于安全审计#
- 将
w的输出写入日志(如w >> /var/log/user_monitor.log),定期检查异常登录(如陌生IP); - 用
who -a记录会话状态,便于事后审计。
(4)理解空闲时间:识别无效会话#
- 空闲时间>1小时的会话(
w -i显示01:00以上),可视为无效会话,终止以释放资源; - 注意:
IDLE时间≠用户离线——可能用户只是离开键盘,需确认后再操作。
6. 常见场景实战:解决实际问题#
场景1:排查高CPU负载#
问题:系统负载突然升高(top显示load average=5.0),需找到占用CPU的用户。
步骤:
- 用
w查看用户CPU使用:$ w 15:30:00 up 10 days, 3:12, 4 users, load average: 5.10, 4.80, 4.50 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 08:00 7:30m 0.05s 0.05s -bash jane pts/0 10.0.0.5 09:15 0.00s 0.23s 0.00s w john pts/1 10.0.0.7 10:30 0.00s 120s 120s ffmpeg -i video.mp4 output.avi admin pts/2 10.0.0.12 14:00 0.00s 0.08s 0.08s top - 发现
john的PCPU=120s(占用100% CPU),运行ffmpeg转码; - 用
ps确认进程:$ ps -u john PID TTY TIME CMD 3456 pts/1 02:00 ffmpeg -i video.mp4 output.avi - 联系
john确认是否可以暂停转码,或调整进程优先级(nice -n 10 ffmpeg ...)。
场景2:维护前确认活跃用户#
问题:需重启服务器升级内核,需提前通知活跃用户。
步骤:
- 用
who查看活跃用户:$ who root tty1 2024-05-20 08:00 jane pts/0 2024-05-20 09:15 (10.0.0.5) john pts/1 2024-05-20 10:30 (10.0.0.7) - 用
wall发送广播消息:$ wall "System will reboot at 18:00 for kernel update. Please save your work!" - 重启前再次用
w确认用户已退出:$ w 17:55:00 up 10 days, 3:47, 1 user, load average: 0.05, 0.03, 0.01 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 08:00 9:55m 0.05s 0.05s -bash
7. 总结#
w和who是Linux用户管理的瑞士军刀:
w是**“详细报告器”**,适合深度分析用户活动;who是**“快速查询器”**,适合获取基础会话信息。
掌握它们的输出逻辑与选项,能帮你快速解决资源排查、安全审计、系统维护等问题。记住:工具的价值在于用对场景——选择合适的命令,才能高效完成任务。
8. 参考资料#
w命令手册:man 1 wwho命令手册:man 1 who- utmp文件格式:
man 5 utmp - 《Linux Administration: A Beginner's Guide》(第10版):涵盖用户管理与终端概念
- Linux Documentation Project(LDP):User Management Guide