Linux查看登陆用户信息:w与who命令深度解析

作为Linux系统管理员,监控用户登录状态是日常运维的核心任务之一——无论是排查资源占用、准备系统维护,还是进行安全审计,都需要快速掌握当前活跃用户的信息。在Linux中,wwho是两个最常用的工具:w命令提供详细的用户活动与系统状态who则专注于快速查询登录会话基本信息

本文将从基础概念入手,深入解析两个命令的输出、选项与最佳实践,并通过实际场景演示如何高效使用它们。无论你是Linux新手还是资深管理员,都能从中找到实用的技巧。

目录#

  1. 基础概念:登录会话与用户状态
    • TTY与PTS:终端类型解析
    • utmp/wtmp:用户会话数据来源
  2. w命令:详细查看活跃用户与系统状态
    • 默认输出深度解析
    • 常用选项与示例(-h/-u/-s/-i等)
  3. who命令:快速查询用户登录信息
    • 默认输出解析
    • 关键选项与示例(-a/-b/-m/-q等)
  4. w vs who:何时选择哪个命令?
  5. 最佳实践:高效使用技巧
  6. 常见场景实战:解决实际问题
  7. 总结
  8. 参考资料

1. 基础概念:登录会话与用户状态#

在深入命令之前,先明确两个核心概念——终端类型用户会话数据存储,这是理解w/who输出的关键。

1.1 TTY与PTS:终端类型解析#

Linux中,用户通过**终端(Terminal)**与系统交互,终端分为两类:

类型全称说明示例
TTYTeletypewriter(电传打字机)物理终端(如服务器本地控制台)tty1(第一个物理终端)
PTSPseudoterminal Slave(伪终端从设备)虚拟终端(如SSH会话、GNOME终端)pts/0(第一个伪终端)

如何区分?

  • TTY的FROM列(w命令中)为空(本地登录);
  • PTS的FROM列显示远程IP或主机名(如192.168.1.100)。

1.2 utmp/wtmp:用户会话数据来源#

wwho的信息均来自**/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 top

2.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.00sw命令本身)
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@JCPUPCPU列,仅保留核心信息:

$ 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格式显示空闲时间#

默认IDLEm(分钟)或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 -w

3. 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 iwho 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占用wwWHAT/JCPU/PCPU列提供详细活动信息
需要快速统计用户数查看启动时间whowho -q/who -b更简洁
需要脚本解析输出w -hwho -q无表头/简洁格式更易处理
需要全面排查会话状态(如dead会话、登录进程)who -awho -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的用户。
步骤

  1. 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
  2. 发现johnPCPU=120s(占用100% CPU),运行ffmpeg转码;
  3. ps确认进程:
    $ ps -u john
    PID TTY      TIME CMD
    3456 pts/1  02:00 ffmpeg -i video.mp4 output.avi
  4. 联系john确认是否可以暂停转码,或调整进程优先级(nice -n 10 ffmpeg ...)。

场景2:维护前确认活跃用户#

问题:需重启服务器升级内核,需提前通知活跃用户。
步骤

  1. 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)
  2. wall发送广播消息:
    $ wall "System will reboot at 18:00 for kernel update. Please save your work!"
  3. 重启前再次用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. 总结#

wwho是Linux用户管理的瑞士军刀

  • w是**“详细报告器”**,适合深度分析用户活动;
  • who是**“快速查询器”**,适合获取基础会话信息。

掌握它们的输出逻辑与选项,能帮你快速解决资源排查、安全审计、系统维护等问题。记住:工具的价值在于用对场景——选择合适的命令,才能高效完成任务。

8. 参考资料#

  1. w命令手册:man 1 w
  2. who命令手册:man 1 who
  3. utmp文件格式:man 5 utmp
  4. 《Linux Administration: A Beginner's Guide》(第10版):涵盖用户管理与终端概念
  5. Linux Documentation Project(LDP):User Management Guide