Linux 用户组查询命令详解

今天我们来深入聊聊 Linux 系统中的用户和组查询命令。这些命令在运维工作中是基础中的基础,尤其在面试中经常被问到,比如"如何查看当前在线用户?""怎么查用户所属组?""历史登录记录怎么看?"这些问题看似简单,但实际操作中涉及文件、NSS(Name Service Switch)机制、权限等知识点。如果只知道 cat /etc/passwd,那就太 low 了,容易被面试官追问"如果有 LDAP 或 SSSD 集成呢?"

一、引言:为什么用户组查询这么重要?

Linux 是多用户系统,用户(User)和组(Group)是权限管理的核心。用户有 UID(User ID)、GID(Group ID),组用于批量授权(如 sudo 组)。查询命令帮助我们:

  • 实时监控:谁在线?在干嘛?
  • 安全审计:历史登录、失败尝试。
  • 权限排查:用户 UID/GID/组成员。
  • 枚举用户/组:本地或远程(LDAP/AD/SSSD)。

二、常用命令对比表

命令 完整英文全名 中文含义 核心用途 是否含远程用户 速度
who who (显示当前登录用户) 查当前在线用户(极简列表)
w w (who + what) 谁 + 在做什么 查在线用户 + 活动状态 + 系统负载
whoami who am I 我是谁 查当前有效用户名(等价 id -un) - 极快
last last login records 最后的登录记录 查历史成功登录明细(wtmp 文件)
lastb last bad login records 最后的失败登录记录 查历史失败登录明细(btmp 文件)
lastlog last login snapshot 最后登录快照 查每个用户最近一次登录(lastlog 文件)
id identity 身份 查用户 UID/GID/所属组 是(getent 后端)
groups groups 查用户所属的所有组(简单版 id)
compgen completion generate 补全生成器 枚举本地纯用户名/组名(bash 内置) 极快
getent get entries 获取条目 全局查询系统各类数据库记录(NSS 支持)

查询用户登录状态的命令多依赖这几个日志(二进制文件): /var/run/utmp(当前登录)、/var/log/wtmp(历史登录)、/var/log/lastlog(用户最后登录快照)。

三、逐个命令详解

1. who:谁(who)
  • 全名:who (显示当前登录用户)。

  • 中文:谁。

  • 核心用途:列出当前在线用户(TTY、登录时间、来源)。极简输出,适合快速查看。

  • 原理 :读 /var/run/utmp/etc/utmp

  • 用法who [选项]

    • 选项:-a(所有,包括死进程)、-q(只用户名计数)、-H(加表头)。
  • 示例

    复制代码
    $ who
    user1    pts/0        2026-01-10 17:00 (192.168.1.100)
    root     tty1         2026-01-10 16:00

    输出:用户名、终端、登录时间、远程 IP。

  • 坑点:不含活动细节;不显示 root 等系统会话有时。

  • 面试 :常问与 users 的区别(who 更详细)。

2. w:谁 + 在做什么(who + what)
  • 全名:w (who is logged on and what they are doing)。

  • 中文:谁 + 在做什么。

  • 核心用途:扩展 who,显示用户活动(当前命令)、空闲时间、系统负载。

  • 原理:基于 utmp + ps 扫描进程。

  • 用法w [用户]

    • 输出头部:当前时间、uptime、用户数、负载平均(1/5/15 min)。
  • 示例

    复制代码
    $ w
     17:15:00 up 1 day,  2:30,  2 users,  load average: 0.10, 0.20, 0.30
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    user1    pts/0    192.168.1.100    17:00    5:00   0.10s  0.05s vim file.txt
    root     tty1     -                16:00    ?      1:20   0.50s bash
    • JCPU:TTY 总 CPU 时间;PCPU:当前进程 CPU 时间;WHAT:当前命令。
  • 坑点:需 root 权限扫描所有进程;网络延迟时慢。

  • 面试:与 who 区别?w 多活动和负载 info。

3. whoami:我是谁
  • 全名:who am I(非正式,但等价 print effective username)。

  • 中文:我是谁。

  • 核心用途:显示当前有效用户名(effective UID)。

  • 原理:调用 geteuid() 系统调用。

  • 用法whoami(无选项)。

  • 示例

    复制代码
    $ whoami
    user1
  • 坑点 :sudo 后变 root;等价 id -un

  • 面试 :为什么不用 echo $USER?(环境变量可伪造)。

4. last:最后的登录记录
  • 全名:last login records。

  • 中文:最后的登录记录。

  • 核心用途:查 wtmp 文件中成功登录历史(用户、终端、时间、时长、来源)。

  • 原理 :逆序读 /var/log/wtmp

  • 用法last [用户] [tty]

    • 选项:-n 10(前 10)、-f 文件-i(IP)、-w(宽输出)、-x(关机/重启)。
  • 示例

    复制代码
    $ last -n 5
    user1    pts/0        192.168.1.100    Fri Jan 10 17:00 - 17:15  (00:15)
    reboot   system boot  5.15.0-50       Fri Jan 10 16:00 - 17:15  (1+01:15)
  • 坑点:wtmp 可被清空;不含失败登录。

  • 面试last reboot 查重启历史。

5. lastb:最后的失败登录记录
  • 全名:last bad login records。

  • 中文:最后的失败登录记录。

  • 核心用途:查 btmp 文件中失败登录(需配置 /var/log/btmp)。

  • 原理:类似 last,但读 btmp(需 pam_lastlog 启用)。

  • 用法sudo lastb

  • 示例

    复制代码
    $ sudo lastb
    user1    ssh:notty    192.168.1.99     Fri Jan 10 16:50 - 16:50  (00:00)
  • 坑点:默认不记录;需 touch /var/log/btmp && chmod 660。

  • 面试:安全审计用,防暴力破解。

6. lastlog:最后登录快照
  • 全名:last login snapshot。

  • 中文:最后登录快照。

  • 核心用途:每个用户最后登录时间/来源(/var/log/lastlog)。

  • 原理:稀疏文件,按 UID 索引。

  • 用法lastlog [选项]

    • 选项:-u 用户-t 天(最近天内)。
  • 示例

    复制代码
    $ lastlog
    Username         Port     From             Latest
    root             pts/0    192.168.1.100    Fri Jan 10 16:00:00 2026
    user1            **Never logged in**
  • 坑点:稀疏文件大;高 UID 系统慢;不准(需 pam 更新)。

  • 面试:与 last 区别?lastlog 是快照,last 是全历史。

7. id:身份
  • 全名:identity。

  • 中文:身份。

  • 核心用途:查 UID/GID/组(当前或指定用户)。

  • 原理:getuid/getgid 系统调用 + NSS。

  • 用法id [用户]

    • 选项:-u(UID)、-g(主 GID)、-G(所有 GID)、-n(名字)。
  • 示例

    复制代码
    $ id
    uid=1000(user1) gid=1000(user1) groups=1000(user1),27(sudo)
    $ id -Gn user2
    user2 adm cdrom
  • 坑点:sudo 变 effective ID。

  • 面试-r 真实 ID vs effective。

8. groups:组
  • 全名:groups。

  • 中文:组。

  • 核心用途:列用户所属组(当前或指定)。

  • 原理:读 initgroups()。

  • 用法groups [用户]

  • 示例

    复制代码
    $ groups
    user1 sudo
  • 坑点 :等价 id -Gn 但更简;不含数字。

  • 面试 :与 id 区别?groups 只组名。

9. compgen:补全生成器
  • 全名:completion generate (Bash 内置)。

  • 中文:补全生成器。

  • 核心用途:枚举本地用户/组(不查 NSS)。

  • 用法compgen -u(用户)、-g(组)。

  • 示例

    复制代码
    $ compgen -u | head -3
    root
    daemon
    bin
  • 坑点:只本地;Bash 专属。

  • 面试:补全脚本用。

10. getent:获取条目
  • 全名:get entries。

  • 中文:获取条目。

  • 核心用途:查询 NSS 数据库(passwd/group/hosts 等),含远程。

  • 原理:/etc/nsswitch.conf 配置。

  • 用法getent [数据库] [键]

    • 示例:getent passwd(所有用户)、getent group sudo
  • 示例

    复制代码
    $ getent passwd user1
    user1:x:1000:1000::/home/user1:/bin/bash
  • 坑点:LDAP 慢;无键枚举支持有限。

  • 面试:为什么优于 cat?支持 LDAP/SSSD。

四、生产运维场景应用与组合

  • 监控在线wwho | grep pts(远程)。
  • 审计登录last -i | grep user1 + sudo lastb
  • 权限查id user1groups user1
  • 枚举getent passwd | cut -d: -f1(全用户)。
  • 组合getent group sudo | cut -d: -f4 | tr ',' '\n'(sudo 成员)。

五、总结与常见Q&A

总结:

  • 实时在线:who/w/whoami。
  • 历史:last/lastb/lastlog。
  • 身份/组:id/groups。
  • 枚举:compgen(本地)/getent(全)。

面试常见Q&A:

  • Q:who 和 w 区别? A:who 只列表,w 加活动/负载。
  • Q:怎么查失败登录? A:lastb,但需启用 btmp。
  • Q:用户从未登录显示? A:lastlog 显示 Never。
  • Q:getent 比 cat /etc/passwd 强在哪? A:getent 用 NSS,支持域用户。完整点可以说:getent 用户来源多样:本地 /etc/passwd、网络(如 LDAP)、缓存(如 SSSD)。
相关推荐
打不了嗝 ᥬ᭄9 小时前
网易 UU 远程 2026年1月 新春升级深度测评:免登录破局 + 安全加码 + 运维专属,重新定义远程协助体验
运维·安全
小杜今天学AI了吗9 小时前
如何配置 linux 系统的conda 环境
linux·运维·conda
oMcLin9 小时前
如何在Ubuntu 22.04 LTS上通过配置ZFS存储池,提升高吞吐量数据库的读写性能与可靠性?
linux·数据库·ubuntu
这就是佬们吗9 小时前
告别 Node.js 版本冲突:NVM 安装与使用全攻略
java·linux·前端·windows·node.js·mac·web
christine-rr9 小时前
linux常用命令(9)——查看系统与硬件信息
linux·运维·服务器·网络·后端
阿豪学编程9 小时前
【Linux】线程同步和线程互斥
linux·开发语言
oMcLin9 小时前
如何在CentOS Stream 9上通过配置Hyper‑V虚拟化实现高效的资源隔离与虚拟机管理?
linux·运维·centos
liuyunshengsir9 小时前
Elasticsearch 高级查询must 多个条件同时满足
linux·服务器·elasticsearch
草莓熊Lotso10 小时前
Linux系统进程调度优化:优先级策略与切换机制深度实践
linux·运维·服务器·c++·人工智能·经验分享·其他