Skip to content

who 命令:显示当前登录用户信息

who 命令是一个简单而有用的 Unix/Linux 系统工具,用于显示当前登录到系统的用户信息。它可以显示用户名、登录终端、登录时间以及(在某些情况下)远程主机名。who 命令从系统的 utmp 文件中读取信息。

2. 基本语法

bash
who [选项] [文件]

如果没有指定文件,who 默认读取 /var/run/utmp 或 /etc/utmp(取决于系统)。

3. 常用选项详解

  • -a: 显示所有可用信息
  • -b: 显示上次系统启动的时间
  • -d: 显示死进程
  • -H: 显示列标题
  • -l: 显示系统登录进程
  • -q: 只显示用户名和登录用户数量
  • -r: 显示当前运行级别
  • -s: 显示用户名、行、时间(默认)
  • -u: 显示空闲时间
  • --lookup: 尝试通过 DNS 规范化主机名

4. 基础用法示例

显示当前登录用户

bash
who

显示带有标题的当前登录用户

bash
who -H

显示完整的信息

bash
who -a

只显示用户名和用户数

bash
who -q

5. 高级用法和技巧

显示上次系统启动时间

bash
who -b

显示运行级别

bash
who -r

显示用户和空闲时间

bash
who -u

从指定文件读取信息

bash
who /var/log/wtmp

6. 实际应用场景

检查系统当前用户负载

bash
#!/bin/bash

user_count=$(who | wc -l)
echo "当前系统登录用户数: $user_count"

if [ $user_count -gt 10 ]; then
    echo "警告:系统用户数量较多,可能需要注意资源使用情况。"
fi

监控特定用户的登录

bash
#!/bin/bash

target_user="admin"

if who | grep -q "^$target_user "; then
    echo "$target_user 已登录系统"
else
    echo "$target_user 未登录系统"
fi

7. 性能考虑

  • who 命令执行速度快,对系统性能影响极小。
  • 在大型系统上,如果 utmp 文件很大,who 可能需要更多时间来处理。
  • 频繁运行 who 命令(如在循环中)可能会造成不必要的系统负担。

8. 安全注意事项

  • who 命令显示的信息可能包含敏感数据,如用户登录模式。
  • 在共享环境中使用时,注意不要泄露敏感的用户活动信息。
  • 定期检查 who 的输出可以帮助发现未授权的访问。
  • 确保只有授权用户能够访问包含登录信息的系统文件(如 utmp)。

9. 与其他工具的集成

结合 Grep 过滤特定用户

bash
who | grep username

使用 Awk 提取特定信息

bash
who | awk '{print $1, $4}'  # 打印用户名和登录时间

与 W 命令对比使用

bash
who; echo "---"; w

10. 故障排除

  • 如果 who 命令没有显示预期的用户,检查 /var/run/utmp 文件的权限和完整性。
  • 在某些系统中,可能需要使用 sudo 来运行 who 以获取完整信息。
  • 如果时间显示不正确,检查系统时间设置。
  • 对于远程登录,如果主机名没有显示,可能是由于 DNS 解析问题。

11. 相关命令

  • w 命令:显示谁已登录以及他们在做什么
  • users 命令:显示当前登录的用户名列表
  • last 命令:显示最近登录的用户列表
  • finger 命令:显示用户信息
  • loginctl 命令:查询和控制systemd登录管理器的状态