Linux who命令(手把手讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 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命令的数据来源于两个关键文件:
/var/run/utmp
:记录当前活动的登录会话/var/log/wtmp
:记录所有历史登录事件
技术细节:
utmp
文件是动态更新的,当用户登录或注销时会被实时修改wtmp
文件是只追加的,用于长期存储登录日志
输出字段含义
字段名 | 含义说明 |
---|---|
USER | 登录用户的系统账号名 |
LINE | 登录使用的终端设备名(如tty1 、pts/0 ) |
FROM | 登录来源的IP地址(仅远程登录时显示) |
IDLE | 用户空闲时间(某些系统版本中显示) |
LOGIN TIME | 用户登录的具体日期和时间 |
三、who命令的高级应用场景
3.1 结合管道实现过滤与格式化
示例1:统计特定用户的登录次数
通过组合grep
和wc
命令,可以快速统计某个用户的历史登录次数:
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
中的PrintLastLog
和LogLevel
参数设置。
4.3 问题3:历史登录记录无法查看
可能原因:
wtmp
文件被意外删除或清空- 文件权限限制了普通用户的访问
解决方案:
使用sudo
权限执行who /var/log/wtmp
,或联系系统管理员恢复日志文件。
五、与相似命令的对比与选择
5.1 who vs whoami
命令 | 核心功能 | 适用场景 |
---|---|---|
who | 列出所有登录用户信息 | 系统监控、用户行为分析 |
whoami | 仅显示当前用户的登录名 | 快速确认当前用户身份 |
5.2 who vs w
对比维度 | who | w |
---|---|---|
输出信息 | 简洁的登录列表 | 包含用户进程、系统负载等详细信息 |
适用场景 | 快速查看用户列表 | 分析用户活跃度与系统资源占用 |
选择建议:
- 需要基础用户列表时使用
who
- 需要结合系统负载分析时选择
w
命令
结论
通过本文的学习,读者应已掌握Linux who命令的基础用法、参数扩展及高级应用场景。作为系统管理员或开发者的日常工具,它不仅能帮助快速定位登录异常,还能通过组合其他命令构建出强大的监控系统。建议读者通过以下步骤深化实践:
- 在本地或虚拟机环境中执行本文中的示例命令
- 尝试编写结合
who
与grep
的自动化监控脚本 - 探索
/var/log/wtmp
文件的结构与分析方法
记住:掌握工具的核心在于理解其背后的数据来源与逻辑关系,而不仅仅是记忆命令行参数。随着对Linux系统运行机制的深入理解,who命令将逐渐成为您优化开发效率和保障系统安全的重要助手。