室内定位服务端Java设计:从iBeacon广播到RSSI定位算法
2026/9/29 18:36:24
今天我们来深入聊聊 Linux 系统中的用户和组查询命令。这些命令在运维工作中是基础中的基础,尤其在面试中经常被问到,比如“如何查看当前在线用户?”“怎么查用户所属组?”“历史登录记录怎么看?”这些问题看似简单,但实际操作中涉及文件、NSS(Name Service Switch)机制、权限等知识点。如果只知道cat /etc/passwd,那就太 low 了,容易被面试官追问“如果有 LDAP 或 SSSD 集成呢?”
Linux 是多用户系统,用户(User)和组(Group)是权限管理的核心。用户有 UID(User ID)、GID(Group ID),组用于批量授权(如 sudo 组)。查询命令帮助我们:
| 命令 | 完整英文全名 | 中文含义 | 核心用途 | 是否含远程用户 | 速度 |
|---|---|---|---|---|---|
| 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(用户最后登录快照)。
/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。users的区别(who 更详细)。w [用户]。$ 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 bashwhoami(无选项)。$ whoami user1id -un。echo $USER?(环境变量可伪造)。/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)last reboot查重启历史。sudo lastb。$ sudo lastb user1 ssh:notty 192.168.1.99 Fri Jan 10 16:50 - 16:50 (00:00)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**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-r真实 ID vs effective。groups [用户]。$ groups user1 sudoid -Gn但更简;不含数字。id区别?groups 只组名。compgen -u(用户)、-g(组)。$ compgen -u | head -3 root daemon bingetent [数据库] [键]。getent passwd(所有用户)、getent group sudo。$ getent passwd user1 user1:x:1000:1000::/home/user1:/bin/bashw或who | grep pts(远程)。last -i | grep user1+sudo lastb。id user1或groups user1。getent passwd | cut -d: -f1(全用户)。getent group sudo | cut -d: -f4 | tr ',' '\n'(sudo 成员)。总结:
面试常见Q&A:
/etc/passwd、网络(如 LDAP)、缓存(如 SSSD)。