作为Linux系统管理员,我每天到办公室第一件事就是敲下w命令。这个看似简单的小工具,实际上是我监控服务器状态的"瑞士军刀"。它能在一瞬间告诉我:谁登录了系统、他们在做什么、系统负载如何——这些信息对维护系统安全稳定至关重要。
w命令的全称是"who and what",它比基础的who命令提供了更丰富的上下文信息。想象一下,当你管理着几十台服务器时,突然收到CPU告警,w命令能帮你快速定位是哪个用户正在运行资源密集型任务。这种即时洞察力,在故障排查时往往能节省数小时的盲目排查时间。
执行w命令后,你会看到类似这样的输出:
code复制 10:30:45 up 15 days, 3:12, 3 users, load average: 0.08, 0.03, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
john pts/0 192.168.1.100 09:15 5.00s 0.10s 0.00s sshd: john [priv]
alice pts/1 203.0.113.42 10:20 1:05m 0.05s 0.05s -bash
root pts/2 10.0.0.1 10:25 0.00s 0.20s 0.01s w
这个输出包含三个关键部分:
提示:系统负载值如果接近或超过CPU核心数,就表示系统可能过载。比如4核CPU上load average为4.0表示CPU资源已被充分利用。
| 字段名 | 说明 | 实际应用场景 |
|---|---|---|
| USER | 登录用户名 | 识别当前活跃用户 |
| TTY | 终端类型 | pts表示远程终端,tty表示本地控制台 |
| FROM | 来源IP地址 | 安全审计时追踪登录来源 |
| LOGIN@ | 登录时间 | 判断会话持续时间 |
| IDLE | 空闲时间 | 发现闲置会话以便清理 |
| JCPU | 该终端所有进程占用CPU时间 | 识别资源消耗大户 |
| PCPU | 当前进程占用CPU时间 | 查看用户正在运行什么 |
| WHAT | 当前进程命令行 | 确认用户实际操作 |
当只需要基本信息时,使用-s参数可以简化输出:
bash复制$ w -s
10:35:22 up 15 days, 3:17, 3 users, load average: 0.05, 0.02, 0.00
USER TTY FROM IDLE WHAT
john pts/0 192.168.1.100 5.00s sshd: john [priv]
alice pts/1 203.0.113.42 1:10m -bash
这种模式去除了JCPU/PCPU等相对少用的信息,在终端空间有限时特别实用。
使用w 用户名格式可以只查看特定用户的信息:
bash复制$ w alice
10:37:01 up 15 days, 3:19, 3 users, load average: 0.01, 0.01, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
alice pts/1 203.0.113.42 10:20 1:12m 0.05s 0.05s -bash
这在检查某个已知用户活动时非常高效。
结合watch命令,可以创建一个实时监控面板:
bash复制watch -n 5 "w -i | grep -v '0.00s'"
这个命令会:
我常用这个方法来发现哪些用户会话可能已经闲置但未注销。
以下脚本可以检测非常规时间的登录活动:
bash复制#!/bin/bash
CURRENT_HOUR=$(date +%H)
if [ $CURRENT_HOUR -gt 22 ] || [ $CURRENT_HOUR -lt 6 ]; then
w -i | mail -s "夜间登录活动警报" admin@example.com
fi
这个脚本会在晚上10点到早上6点之间检测到任何登录活动时发送邮件通知。
bash复制w -h | awk '{print $1,$3,$4}' | sort | uniq -c
这个命令组合可以统计各来源IP的登录次数,对安全审计很有帮助。
将w命令输出重定向到日志文件并添加时间戳:
bash复制echo "=== $(date) ===" >> /var/log/user_activity.log
w >> /var/log/user_activity.log
然后设置cronjob每小时运行一次,就能建立完整的用户活动历史记录。
w和who统计会话的方式略有不同:
who统计的是登录会话数w统计的是活动终端数如果一个用户通过多个终端登录,w会显示为多个条目,而who可能合并显示。
IDLE列的显示格式可能有几种:
5.00s:5秒1:05m:1分5秒2days:2天old:会话已存在很久但活动不明确上周我们的一台数据库服务器突然出现CPU负载飙升。使用w命令快速发现了问题:
code复制$ w
14:20:33 up 30 days, 7:45, 8 users, load average: 15.32, 8.76, 4.21
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
dev1 pts/0 10.0.1.15 13:45 0.00s 2:45 2:30 /usr/bin/python3 data_import.py
从输出可见:
进一步检查发现是开发人员误操作导致的全表扫描。通过w命令,我们仅用30秒就定位到了问题源头。
在一次例行安全检查中,我们发现了一个异常登录:
code复制$ w
03:15:22 up 45 days, 12:30, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
john pts/0 192.168.1.100 09:15 5.00s 0.10s 0.00s sshd: john [priv]
admin pts/1 156.34.78.90 02:50 0.00s 0.20s 0.15s -bash
可疑点:
进一步调查确认这是一次未授权的访问尝试,我们立即采取措施封锁了该IP。
在非常繁忙的系统上,w命令可能会消耗可观资源。可以通过以下方式优化:
-s简化输出w,改用who或检查/var/run/utmp将w命令输出与以下工具结合可以构建更完善的监控系统:
例如,这个命令可以提取当前用户数供Prometheus抓取:
bash复制echo "current_users $(w -h | wc -l)" > /var/lib/node_exporter/textfile_collector/users.prom
TTY列中的设备标识包含重要信息:
| 设备类型 | 说明 | 典型场景 |
|---|---|---|
| tty1 | 本地虚拟控制台 | 物理服务器直接登录 |
| pts/0 | 伪终端从设备 | SSH远程连接 |
| :0 | X11显示服务器 | 图形界面登录 |
了解这些标识有助于判断用户的实际登录方式。
这两个值的比例可以揭示很多信息:
权限控制:普通用户也可以运行w命令查看其他用户活动,在共享主机环境中可能涉及隐私问题。考虑使用mesg n限制非root用户的查看权限。
时间同步:确保所有服务器的时钟同步(使用NTP),否则登录时间记录可能不准确,影响问题排查。
日志轮转:如果设置w命令输出日志,记得配置logrotate防止日志文件无限增长。
安全考虑:w命令显示的IP信息可能被恶意用户利用进行内部网络探测。在高度安全敏感的环境中,可能需要限制普通用户访问。
虽然w命令功能强大,但在某些场景下其他工具可能更合适:
who命令:当只需要基本登录信息时更轻量last命令:查看历史登录记录而非当前会话ps命令:更详细的进程信息top/htop:实时系统资源监控我通常的工作流程是:
w快速概览ps -u 用户名深入检查last查看历史记录去年我们遇到一个棘手问题:某台服务器每隔几天就会神秘重启。通过分析w命令的历史日志,我们发现了一个模式:
code复制$ grep -A 5 "===" /var/log/user_activity.log | less
=== Tue Mar 15 02:15:01 UTC 2022 ===
02:15:03 up 3 days, 5:20, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
backup pts/0 10.0.0.100 02:00 0.00s 5:30 5:25 /usr/bin/backup_script.sh
=== Fri Mar 18 02:15:01 UTC 2022 ===
02:15:03 up 3 days, 5:18, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
backup pts/0 10.0.0.100 02:00 0.00s 5:45 5:40 /usr/bin/backup_script.sh
规律很明显:每隔3天凌晨2点,backup用户运行一个脚本,随后系统重启。进一步检查发现是备份脚本存在内存泄漏,触发了OOM killer。如果没有w命令的历史记录,这个每三天出现一次的问题会很难诊断。