Linux命令-who(显示当前登录用户信息) Linux命令-who显示当前登录用户信息 简介 语法⚙️ 选项 实战示例示例 1基本 who最常用示例 2who am i - 当前终端会话示例 3who -b -r -q 实用子选项示例 4who -u 查看空闲时间示例 5who -a 全量输出示例 6读取其他 utmp 文件示例 7实战脚本 - 踢人下线示例 8who 与其他命令的协同⚠️ 注意事项 总结 相关命令快速参考who命令读取 utmp 数据库默认/var/run/utmp显示当前登录系统的所有用户及其终端设备、登录时间、远程主机等详细信息。它是查询谁在用这台机器的事实标准比users详细比w简洁。who -b查启动时间、who -r查运行级别、who -q快速统计等子选项是运维日常高频用法。 简介项目说明命令全称who is logged in所属包util-linux数据源默认/var/run/utmp当前会话历史/var/log/wtmp追加历史BTMP失败登录lastb输出格式默认 4 列USER、终端、登录时间、远程主机退出码0成功、1无法打开文件用户权限普通用户可读/var/run/utmp权限 0664现代替代w更详细、who标准、users最简相关命令层次命令信息量适用场景users极简脚本统计who -q极简数量快速统计who标准日常查询who -a全量故障排查w含进程看谁在跑什么 语法who[选项][文件][am i]文件可选 utmp 格式文件路径am iwho am i等价who -m显示当前终端的会话信息⚙️ 选项选项简写说明--all-a等价于-b -d --login -p -r -t -T -u全选项组合--boot-b系统最近启动时间--dead-d显示死掉的进程已退出但 utmp 记录仍在--heading-H打印列标题--login-l显示登录进程如login、SSH 守护--message-T显示用户消息状态± 标志--mesg类似-T但只输出状态字符--process-p显示由 init 衍生的活跃进程--count-q仅显示用户名 总数--runlevel-r显示当前运行级别--short-s默认格式仅 USER/LINE/TIME--time-t系统上次时钟变更--users-u显示空闲时间和 PID--writable-T同--message--lookup-l尝试通过 DNS 反查主机名默认会加 -n 不查--no-lookup-n不反查 DNS数字 IPam i等价-m仅显示当前终端--help-h帮助--version-V版本-T消息状态标志允许写入mesg y-禁止写入mesg n?无法确定 实战示例示例 1基本 who最常用# 标准输出4 列$whoalice pts/02024-01-15 09:00:15(192.168.1.5)bob pts/12024-01-1510:30:22(192.168.1.6)charlie pts/22024-01-1513:00:01(192.168.1.7)root tty12024-01-15 09:00:00# 加 -H 显示列标题$who-HNAME LINE TIME COMMENT alice pts/02024-01-15 09:00:15(192.168.1.5)bob pts/12024-01-1510:30:22(192.168.1.6)charlie pts/22024-01-1513:00:01(192.168.1.7)root tty12024-01-15 09:00:00# 数字 IP不反查 DNS$who-nHalice pts/02024-01-15 09:00:15(192.168.1.5)# 仅在反向解析出错时才有区别字段详解字段含义示例NAME用户名aliceLINE终端设备pts/0伪终端、tty1物理终端TIME登录时间2024-01-15 09:00:15COMMENT远程主机或内核版本(192.168.1.5)表示 SSH 来源本地登录为(内核版本)终端类型说明tty1-tty6物理控制台CtrlAltF1~F6ttyS0/ttyS1串口pts/0~pts/N伪终端SSH、telnet、xterm示例 2who am i - 当前终端会话# 查看我是谁登录的原始登录名$whoam i alice pts/02024-01-15 09:00:15(192.168.1.5)# 等价$who-malice pts/02024-01-15 09:00:15(192.168.1.5)# 等价$whoam i am i alice pts/02024-01-15 09:00:15(192.168.1.5)# 与 whoami 区别$whoamialice# 当前有效 UID 对应用户名# su 切换后$sudosu- $whoamiroot $whoam i alice pts/02024-01-15 09:00:15(192.168.1.5)# ← 注意仍是 alice**原始登录会话不变**# 这与 sudo LOGNAME 行为不同示例 3who -b -r -q 实用子选项# 1. 系统启动时间$who-bsystem boot2024-01-15 09:00:00# 注意时间格式无年份但可与 uptime 交叉验证# 2. 当前运行级别$who-rrun-level52024-01-15 09:00:15# 等价$ runlevel N5# 3. 上次系统时钟变更UTC 漂移$who-t2024-01-1512:00:00# 4. 快速统计 列表$who-qalice bob charlie root# users4# 一行用户名 数量# 5. 显示消息状态$who-Talice pts/02024-01-15 09:00:15(192.168.1.5)bob - pts/12024-01-1510:30:22(192.168.1.6)charlie pts/22024-01-1513:00:01(192.168.1.7)# alice 和 charlie 允许 writebob 禁用了mesg n示例 4who -u 查看空闲时间# -u 显示每个用户的空闲时间和进程 ID$who-uHNAME LINE TIME IDLE PID COMMENT alice pts/02024-01-15 09:00:15.1234(192.168.1.5)bob pts/12024-01-1510:30:22 00:151245(192.168.1.6)charlie pts/22024-01-1513:00:01 02:301256(192.168.1.7)old pts/32024-01-15 00:00:00 old -(192.168.1.8)# 字段说明# . 当前活动无空闲# 数字 空闲时间# old 用户已断开但 utmp 未更新典型的僵尸会话# - PID 信息丢失old状态的典型问题用户 SSH 断开但 utmp 未及时清理实际没人在用。结合pkill -u user清理。示例 5who -a 全量输出# -a -b -d --login -p -r -t -T -u$who-aHNAME LINE TIME IDLE PID COMMENT EXIT system boot2024-01-15 09:00:00 run-level52024-01-15 09:00:15 LOGIN tty12024-01-15 09:00:301000id1alice pts/02024-01-15 09:00:15.1234(192.168.1.5)bob - pts/12024-01-1510:30:22 00:151245(192.168.1.6)old pts/32024-01-15 00:00:00 old -(192.168.1.8)run-level(to lvl5)2024-01-15 09:00:15 pts/32024-01-1514:00:001234id3term0exit02024-01-1512:00:00# 包含# - 系统启动时间system boot# - 运行级别切换# - 登录进程LOGIN tty1# - 用户会话# - 死进程pts/3 死掉的会话# - 时钟变更# 这是 who 最详尽的输出示例 6读取其他 utmp 文件# 默认 /var/run/utmp当前会话# 指定 wtmp历史登录$who/var/log/wtmp|head-10root tty12024-01-12 09:00:00 alice pts/02024-01-12 09:30:00(192.168.1.5)alice pts/12024-01-1214:00:00(192.168.1.5)rebootsystem boot2024-01-13 09:00:00 root tty12024-01-13 09:00:05...# wtmp 包含历史**推荐用 last 命令**带时间过滤# 实战统计 wtmp 中历史登录过的用户数$who/var/log/wtmp|awk{print $1}|sort-u|wc-l15# 实战找出最近 7 天登录最频繁的用户$who/var/log/wtmp|awk{print $1, $3}|sort|uniq-c|sort-rn|head124alice2024-01-1585bob2024-01-1540charlie2024-01-15示例 7实战脚本 - 踢人下线# 场景发现可疑登录踢出指定用户 $who-uHNAME LINE TIME IDLE PID COMMENT alice pts/02024-01-15 09:00:15.1234(192.168.1.5)mallory pts/12024-01-1514:00:01 00:019999(203.0.113.66)# ↑ mallory 是异常 IP# 方式 1发送广播警告$sudowallSuspicious session detected. Please save your work and logout.# 方式 2踢掉所有 mallory 的进程$sudopkill-umallory# 或更精确杀掉登录 shell$sudokill-99999# 方式 3通过脚本逐个踢出#!/bin/bashUSER$1ifwho|grep-q^$USER;thensudopkill-KILL-u$USERsudowall$USER已被管理员强制下线echo已踢出用户$USERelseecho用户$USER不在线fi$ ./kickout.sh mallory 已踢出用户 mallory示例 8who 与其他命令的协同# 1. who last 全面分析登录$who# 当前$ last-n20# 历史$ lastb-n5# 失败登录# 2. 监控告警异常登录$diff(who-H|head-1;who-H)(who-H)# 无输出 无变化# 有输出 有人登录或退出# 3. 与 /etc/passwd 联动$foruserin$(who|awk{print $1}|sort-u);doinfo$(getentpasswd$user|cut-d: -f3,5)echo$user(UID:GECOS) $infodonealice(1000:Alice Wang)bob(1001:Bob Lee)charlie(1002:Charlie Chen)⚠️ 注意事项1. 字段顺序可能变化旧版本who的时间字段在第 3 列新版本加-H才稳定。脚本中处理输出时务必先-H确认列顺序。2.-H与-T输出格式差异-H输出 5 列表头NAME/LINE/TIME/COMMENT-T输出 6 列表头NAME/-/LINE/TIME/COMMENT。两者的列数不同脚本处理时要小心。3. DNS 反查延迟who默认会反查远程主机的 PTR 记录如果 DNS 慢或不可达如内部机器who会卡顿 5-30 秒。生产脚本必须加-n--no-lookup。4. 容器内可能无 utmp$dockerrun--rmcentos:7who# 无输出Docker 容器内通常无 utmp 写入机制除非显式挂载/dev/log PAM 配置。5. who am i 慎用who am i中am和i之间要严格两个空格才等价-m部分老 shell 中who am i与who -m行为可能不一致。推荐直接用who -m。6. 死进程与幽灵会话who -d显示的死进程是已经退出但 utmp 记录未清理的会话不代表真有人在线。结合pkill清理。7. 时间戳是本地时间还是 UTCwho输出的是本地时间依据/etc/localtime。跨时区分析时务必用TZUTC who显式指定。8. 与 systemctl get-default 的区别who -r在 systemd 系统下显示模拟的运行级别5/3不一定与systemctl get-default一致特别是设置 default 后未重启时。重启用systemctl get-default。 总结who是查询谁在用这台机器的标准答案——平衡信息量与可读性。本节要点核心选项who标准who -b启动时间who -r运行级别who -q快速统计who am i/who -m当前会话who -u空闲时间who -a全量生产脚本永远加-n关闭 DNS 反查加-H拿列标题便于 awk 解析对比记忆users极简→who -q数量→who标准→who -a全量→w命令故障排查异常 IP 登录用who -uH看空闲时间pkill -u踢人最终建议日常查询用who -H生产脚本用who -qnH详细分析配合last/w/journalctl踢人下线用pkill -u USER。 相关命令命令用途w详细登录信息 正在执行的命令users极简用户名列表whoami当前有效用户logname原始登录用户idUID/GID/组last历史登录wtmplastb失败登录btmplastlog各用户最后登录时间utmpdump解析 utmp/wtmp 二进制pkill -u USER踢出指定用户finger/pinky用户信息已少用wall广播消息给所有登录用户write USER单聊write 命令