Linux who命令(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在Linux系统运维和开发过程中,掌握用户状态监控工具是提升系统管理效率的关键技能之一。Linux who命令作为基础但功能强大的工具,能够实时显示当前登录系统的用户信息、终端类型及登录时间等核心数据。对于编程初学者而言,它是一个了解系统运行状态的入门级工具;而对中级开发者来说,通过组合使用who命令与管道、文件操作等技术,可以构建出更复杂的系统监控方案。本文将从基础用法逐步深入,结合实际案例,帮助读者系统掌握这一工具的使用逻辑与应用场景。


一、who命令的核心功能与使用场景

1.1 基础功能解析

who命令的全称是"who are you",其核心作用是列出当前登录系统的用户信息。它通过读取系统日志文件/var/run/utmp/var/log/wtmp中的记录,展示以下关键信息:

  • 用户名(Username)
  • 登录终端(Terminal)
  • 登录时间(Login Time)
  • 登录来源地址(对于网络连接终端)

形象比喻:可以将who命令想象成一个“系统监控室的观察员”,它持续关注着所有用户登录系统的活动轨迹,并将这些轨迹以简洁的文本格式呈现出来。

基础语法示例

who  

执行结果示例

user1   tty1         2023-10-05 14:30  
user2   pts/0        2023-10-05 14:35 (192.168.1.100)  

1.2 典型使用场景

  • 系统安全审计:快速查看是否存在异常登录用户
  • 开发协作调试:确认同事是否正在使用共享开发环境
  • 运维监控:结合脚本实现自动化登录状态报警
  • 日志分析:与last命令结合,追溯历史登录记录

二、who命令的进阶用法与参数详解

2.1 核心参数与扩展功能

参数 -a:显示完整信息

使用-a参数(等同于--all)可让who命令展示所有可用字段,包括:

  • 用户进程ID(PID)
  • 控制终端(Controlling Terminal)
  • 登录进程ID(Process ID)
  • 登录ID(Login ID)

示例代码

who -a  

输出解析

run-level 5  2023-10-05 14:30  
...(其他系统信息略)...  
user1     tty1         2023-10-05 14:30  
user2     pts/0        2023-10-05 14:35 (192.168.1.100)  

参数 -q:快速查看用户数量

-q参数(等同于--count)用于快速统计当前登录用户数量,适合需要简洁结果的场景。

示例代码

who -q  

输出示例

user1   user2  

参数 -m:仅显示当前终端信息

通过-m参数,who命令会仅输出当前终端的登录信息,这对于需要排除其他用户干扰的场景特别有用。

示例代码

who -m  

输出示例

user2   pts/0        2023-10-05 14:35 (192.168.1.100)  

2.2 who命令的输入源与输出逻辑

输入源解析

who命令的数据来源于两个关键文件:

  1. /var/run/utmp:记录当前活动的登录会话
  2. /var/log/wtmp:记录所有历史登录事件

技术细节

  • utmp文件是动态更新的,当用户登录或注销时会被实时修改
  • wtmp文件是只追加的,用于长期存储登录日志

输出字段含义

字段名含义说明
USER登录用户的系统账号名
LINE登录使用的终端设备名(如tty1pts/0
FROM登录来源的IP地址(仅远程登录时显示)
IDLE用户空闲时间(某些系统版本中显示)
LOGIN TIME用户登录的具体日期和时间

三、who命令的高级应用场景

3.1 结合管道实现过滤与格式化

示例1:统计特定用户的登录次数

通过组合grepwc命令,可以快速统计某个用户的历史登录次数:

who /var/log/wtmp | grep "user1" | wc -l  

示例2:提取远程登录用户的IP地址列表

使用awk命令提取登录来源IP字段:

who | awk '{print $5}' | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"  

3.2 与系统监控工具联动

案例:实时监控登录事件

通过watch命令每秒刷新who命令的输出,实现动态监控效果:

watch -n 1 "who -q"  

案例:构建登录审计脚本

创建一个脚本文件login_monitor.sh,定时记录登录用户变化:

#!/bin/bash  
LOG_FILE=/var/log/login_monitor.log  
who >> $LOG_FILE  

并添加到crontab每5分钟执行一次:

*/5 * * * * /path/to/login_monitor.sh  

四、常见问题与解决方案

4.1 问题1:who命令输出为空

可能原因

  • 当前终端未被正确记录到utmp文件中
  • 文件权限不足(需以root权限执行who

解决方案
尝试使用sudo who或检查终端配置文件(如/etc/utmp的权限设置)。

4.2 问题2:远程登录IP地址未显示

可能原因

  • 使用SSH的本地终端模拟器未正确传递来源地址
  • 系统日志配置未启用IP记录

解决方案
检查SSH配置文件/etc/ssh/sshd_config中的PrintLastLogLogLevel参数设置。

4.3 问题3:历史登录记录无法查看

可能原因

  • wtmp文件被意外删除或清空
  • 文件权限限制了普通用户的访问

解决方案
使用sudo权限执行who /var/log/wtmp,或联系系统管理员恢复日志文件。


五、与相似命令的对比与选择

5.1 who vs whoami

命令核心功能适用场景
who列出所有登录用户信息系统监控、用户行为分析
whoami仅显示当前用户的登录名快速确认当前用户身份

5.2 who vs w

对比维度whow
输出信息简洁的登录列表包含用户进程、系统负载等详细信息
适用场景快速查看用户列表分析用户活跃度与系统资源占用

选择建议

  • 需要基础用户列表时使用who
  • 需要结合系统负载分析时选择w命令

结论

通过本文的学习,读者应已掌握Linux who命令的基础用法、参数扩展及高级应用场景。作为系统管理员或开发者的日常工具,它不仅能帮助快速定位登录异常,还能通过组合其他命令构建出强大的监控系统。建议读者通过以下步骤深化实践:

  1. 在本地或虚拟机环境中执行本文中的示例命令
  2. 尝试编写结合whogrep的自动化监控脚本
  3. 探索/var/log/wtmp文件的结构与分析方法

记住:掌握工具的核心在于理解其背后的数据来源与逻辑关系,而不仅仅是记忆命令行参数。随着对Linux系统运行机制的深入理解,who命令将逐渐成为您优化开发效率和保障系统安全的重要助手。

最新发布