Linux用户监控命令users/who/w详解与应用
2026/7/17 8:54:53 网站建设 项目流程

1. Linux用户信息查看命令全景解析

在Linux系统管理中,了解当前活跃用户是系统管理员的基础技能。users、w和who这三个看似简单的命令,实际上构成了Linux用户监控的黄金三角组合。它们各司其职又相互补充,就像运维人员的"三只眼睛",从不同维度透视系统状态。

我管理过数百台Linux服务器,这三个命令的使用频率高居日常操作前五。特别是在处理多用户环境、排查异常登录或分析系统负载时,它们的组合使用往往能快速定位问题根源。不同于需要复杂配置的监控系统,这些命令开箱即用,在任何Linux发行版上都能提供实时数据。

2. 基础命令解析与对比

2.1 users命令:极简用户清单

这个最简单的命令只做一件事——显示当前登录用户的用户名列表。它的输出干净利落,每个用户名占一行,重复登录会显示多次。在需要快速确认是否有异常用户登录时,这种简洁性反而成为优势。

$ users john alice john root

注意:users命令不会显示登录来源或时间等信息,适合嵌入脚本中进行快速用户存在性检查

2.2 who命令:标准登录信息

who命令提供了更丰富的信息维度,包括:

  • 用户名
  • 登录终端(tty/pts)
  • 登录时间
  • 来源IP(如果是远程登录)

典型输出:

$ who john tty1 2023-08-20 09:30 alice pts/0 2023-08-20 10:15 (192.168.1.100) root pts/1 2023-08-20 11:03 (203.0.113.42)

who命令有一个非常有用的变体who -a,可以显示所有详细信息,包括系统启动时间、运行级别等。我在处理服务器异常重启问题时经常使用这个参数。

2.3 w命令:综合监控面板

w命令是这三个命令中的"瑞士军刀",它整合了who和uptime的信息,并增加了进程级别的数据:

  1. 系统运行时间和平均负载
  2. 每个登录用户及其进程
  3. 用户当前活动(IDLE表示空闲)
  4. CPU占用情况

示例输出:

$ w 12:30:45 up 3 days, 4:22, 3 users, load average: 0.15, 0.10, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT john tty1 - 09:30 3:00m 0.10s 0.10s -bash alice pts/0 192.168.1.100 10:15 5.00s 0.20s 0.05s sshd: alice [priv] root pts/1 203.0.113.42 11:03 1:00 0.30s 0.30s top

3. 高级应用场景

3.1 安全审计实战

这三个命令组合使用可以构建基础的安全审计方案:

  1. 首先用users快速检查是否有异常用户名
  2. 然后通过who确认登录来源
  3. 最后用w分析用户活动

我曾在某次安全事件中使用以下命令链发现异常:

$ who | grep -vE '(192.168|localhost)'

这个命令过滤出来自内网以外的所有登录,成功捕捉到攻击者的SSH连接。

3.2 性能问题排查

当服务器负载突然升高时,w命令的最后一列"WHAT"特别有用:

$ w | awk 'NR>2{print $8}' | sort | uniq -c | sort -nr

这个管道可以统计当前运行的所有命令及其出现次数,快速定位消耗资源的进程。

3.3 自动化监控脚本

在编写监控脚本时,这三个命令各有用途:

# 检查用户数是否超过阈值 if [ $(users | wc -w) -gt 10 ]; then echo "警告:用户数超标" | mail -s "用户警报" admin@example.com fi # 记录异常登录 who | awk '$3 !~ /^:/ {print $1,$3,$5}' >> /var/log/remote_logins.log

4. 技术细节深度解析

4.1 数据来源探究

这些命令的数据都来自/var/run/utmp文件(当前登录信息)和/var/log/wtmp(历史登录记录)。理解这点很重要,因为:

  1. 直接解析这些文件可以获得更灵活的数据
  2. 文件权限问题可能导致命令失效
  3. 日志轮转会影响历史数据查询

我常用的utmpdump工具可以直接查看这些二进制文件内容:

$ utmpdump /var/run/utmp

4.2 时间格式处理

who和w命令显示的时间可能因系统配置而异。要获得统一格式,可以设置LC_ALL环境变量:

$ LC_ALL=C who

这在编写跨区域脚本时特别重要。

4.3 网络连接追踪

对于pts终端,我们可以进一步追踪其网络连接:

$ lsof -i -n | grep $(who | grep pts | awk '{print $NF}' | tr -d ')(')

这个命令组合可以显示所有远程登录用户的完整网络连接信息。

5. 常见问题解决方案

5.1 命令输出不一致

有时users和who显示的用户数不一致,通常是因为:

  • users统计所有登录会话(包括图形界面)
  • who可能过滤了某些终端类型

解决方案是统一使用参数:

$ who -u $ users --version # 确认版本差异

5.2 时间显示问题

当系统时区配置错误时,登录时间可能显示异常。修复方法:

$ timedatectl set-timezone Asia/Shanghai $ hwclock --systohc

5.3 强制注销用户

发现可疑用户时,可以用pkill命令终止其会话:

$ pkill -9 -u username

然后通过/var/log/secure日志分析登录过程。

6. 性能优化技巧

6.1 减少系统调用

在频繁执行的监控脚本中,直接读取utmp比调用who命令更高效:

#!/bin/bash { echo "Users: $(users | wc -w)" echo "Load: $(awk '{print $1,$2,$3}' /proc/loadavg)" } > /tmp/system_status

6.2 日志轮转配置

合理配置wtmp轮转可以平衡历史数据和磁盘空间:

# /etc/logrotate.conf /var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 12 }

6.3 自定义输出格式

使用awk处理who命令输出,生成定制化报告:

$ who | awk 'BEGIN{print "Active Sessions Report\n====================="} {printf "User: %-8s From: %-15s When: %s\n", $1, $5, $3}'

7. 扩展应用场景

7.1 容器环境监控

在Docker/Kubernetes环境中,这些命令同样适用:

# 在容器内执行 $ who $ w

但需要注意:

  • 容器可能使用精简版系统,缺少某些命令
  • 用户信息可能来自宿主机的映射

7.2 自动化运维集成

结合Ansible等工具实现自动化用户监控:

- name: Check active users hosts: all tasks: - name: Get user count command: who | wc -l register: user_count - name: Alert if users > 3 mail: to: admin@example.com subject: "High user count on {{ inventory_hostname }}" body: "{{ user_count.stdout_lines }} users logged in" when: user_count.stdout|int > 3

7.3 安全合规检查

满足等保要求中的用户会话监控:

#!/bin/bash # 记录所有root登录 who -u | grep ^root >> /var/log/root_access.log # 检查空密码登录 grep "password not required" /var/log/secure | awk '{print $NF}' | sort -u

8. 命令历史与发展

8.1 传统Unix实现

最早的who命令出现在1971年的Unix V1中,功能极为基础。随着多用户系统发展,逐渐增加了终端类型、登录时间等字段。

8.2 Linux各发行版差异

不同发行版可能有细微差别:

  • CentOS: who命令支持-H显示标题行
  • Ubuntu: w命令默认显示更详细的负载信息
  • Alpine: 精简版可能缺少users命令

8.3 现代替代方案

虽然这些命令仍然有效,但现代系统也提供了其他选择:

$ loginctl list-sessions $ last -a

9. 实用脚本合集

9.1 登录用户监控脚本

#!/bin/bash # monitor_users.sh MAX_USERS=5 LOG_FILE="/var/log/user_monitor.log" current_users=$(who | wc -l) timestamp=$(date "+%Y-%m-%d %H:%M:%S") echo "[$timestamp] Current users: $current_users" >> $LOG_FILE if [ $current_users -gt $MAX_USERS ]; then echo "WARNING: User threshold exceeded!" >> $LOG_FILE who >> $LOG_FILE # 发送警报邮件 echo "User count $current_users exceeds max $MAX_USERS" | \ mail -s "User Alert" admin@example.com fi

9.2 异常登录检测

#!/bin/bash # check_logins.sh ALLOWED_IPS=("192.168.1.*" "10.0.0.*") who -u | while read -r line; do ip=$(echo $line | grep -oE '\([^)]+\)' | tr -d '()') if [[ -n "$ip" ]]; then allowed=0 for range in "${ALLOWED_IPS[@]}"; do if [[ "$ip" == $range ]]; then allowed=1 break fi done if [ $allowed -eq 0 ]; then echo "Suspicious login: $line" >> /var/log/suspicious_logins.log fi fi done

9.3 用户活动报告

#!/bin/bash # user_report.sh REPORT_FILE="/tmp/user_activity_$(date +%Y%m%d).csv" echo "User,Login Time,Idle Time,Process" > $REPORT_FILE w -h | awk '{print $1","$4","$5","$8}' >> $REPORT_FILE # 发送报告 mail -s "Daily User Activity Report" -a $REPORT_FILE admin@example.com < /dev/null

10. 性能考量与最佳实践

10.1 大型系统优化

在用户数超过100的系统中:

  • 避免频繁执行who/w命令,改用utmp直接读取
  • 考虑使用缓存机制
  • 限制历史记录保留时间

10.2 日志管理建议

  • 定期归档/var/log/wtmp
  • 使用logrotate管理日志大小
  • 敏感信息应脱敏处理

10.3 安全加固措施

  1. 保护utmp/wtmp文件权限:
chmod 644 /var/run/utmp /var/log/wtmp chown root:utmp /var/run/utmp /var/log/wtmp
  1. 监控关键文件变更:
inotifywait -m -e modify /var/run/utmp /var/log/wtmp
  1. 使用auditd记录特权操作:
auditctl -w /var/run/utmp -p wa -k user_sessions

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询