齐齐哈尔市网站建设_网站建设公司_关键词排名_seo优化
2026/1/10 16:42:35 网站建设 项目流程

今天我们来深入聊聊 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)。

二、常用命令对比表

命令完整英文全名中文含义核心用途是否含远程用户速度
whowho (显示当前登录用户)查当前在线用户(极简列表)
ww (who + what)谁 + 在做什么查在线用户 + 活动状态 + 系统负载
whoamiwho am I我是谁查当前有效用户名(等价 id -un)-极快
lastlast login records最后的登录记录查历史成功登录明细(wtmp 文件)
lastblast bad login records最后的失败登录记录查历史失败登录明细(btmp 文件)
lastloglast login snapshot最后登录快照查每个用户最近一次登录(lastlog 文件)
ididentity身份查用户 UID/GID/所属组是(getent 后端)
groupsgroups查用户所属的所有组(简单版 id)
compgencompletion generate补全生成器枚举本地纯用户名/组名(bash 内置)极快
getentget 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)。

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

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

立即咨询