lastlog 是查询用户最后一次成功登录的最快方式,直接读取按uid索引的二进制文件 /var/log/lastlog,需root权限;支持 -t 和 -b 参数筛选活跃或闲置账号,但不记录失败登录或su/sudo行为。

lastlog 是最直接、最轻量的方式,它不扫描整个日志文件,而是直接查 /var/log/lastlog —— 这个文件专为“每个用户最后一次登录”而设计,结构紧凑、查询极快。
为什么用 lastlog 而不是 last
last 读的是 /var/log/wtmp,里面存的是全部历史会话(可能几万条),要从中找“最后一次”,得倒序遍历再去重,效率低且结果不保证准确(比如用户反复登出/登录,last username | head -1 可能漏掉更早但未被截断的记录)。而 lastlog 的底层是按 UID 索引的二进制文件,lastlog -u alice 就是单次定位,毫秒级返回。
lastlog 必须用 root 权限运行
普通用户执行会报错:lastlog: /var/log/lastlog: Permission denied。这不是权限配置问题,而是该文件默认只对 root 可读:
- 必须加
sudo:sudo lastlog -u alice - 或切换到 root:
sudo -i后再运行 - 不加权限直接跑会静默失败,无输出也不报错——这点容易被忽略
快速筛选近期活跃用户
生产环境常需排查“哪些账号最近动过”,这时别逐个查,用 -t(since days)参数:
-
sudo lastlog -t 7:列出所有过去 7 天内登录过的用户(含时间、终端、IP) -
sudo lastlog -b 30:列出 30 天前最后一次登录的用户(适合发现长期闲置账号) -
sudo lastlog | awk '$3 != "Never" {print $1, $3, $4}':过滤掉从未登录过的账号,只看有实际登录时间的行
注意 /var/log/lastlog 的局限性
这个文件不会记录失败登录、也不会记录 su/sudo 切换行为,它只记成功登录且写入了 utmp 的会话。如果系统启用了 systemd-logind 或某些容器化登录流程,部分登录可能未触发 utmp 写入,lastlog 就查不到。此时得配合 last -a -i | head -20 手动扫最近记录,或查 /var/log/secure 里的 auth 日志。











