wtmp 与 last
wtmp 是一个二进制登录记录文件,每次登录、登出、重启、运行级别切换都会追加一条记录;last 命令把它还原成可读的登录历史。相比文本日志,它通常保留更久、更完整,且不容易被单纯改文本的方式篡改,因此常用于核对「某账号到底登录过几次、从哪来、待了多久」。与之配套的还有 utmp(记录当前在线会话,供 who 使用)和 btmp(记录失败尝试,供 lastb 使用)。
基本信息
| 文件 | /var/log/wtmp(历史)、/var/run/utmp 或 /run/utmp(当前)、/var/log/btmp(失败) |
|---|---|
| 读取工具 | last 读 wtmp、who 读 utmp、lastb 读 btmp、utmpdump 可解码原始记录 |
| 常用选项 | last -F 完整时间、-a 主机名放末列、-i 显示 IP、-x 含重启与运行级别、-n 限制条数 |
| 写入者 | systemd-update-utmp 或登录程序,仅负责追加 |
| 权限 | 文件通常 664 root:utmp,普通用户可读 wtmp |
| 保留期 | 由 logrotate 决定,各发行版差异大,需单独评估历史深度 |
典型使用场景
- 核对登录次数与时长:last 的起止两行即为一次会话
- 判断是否存在非工作时段登录或来源 IP 异常
- 确认重启时间,作为时间线的锚点事件
- 与 auth.log 交叉验证:文本日志缺失时 wtmp 仍可能留存
- 识别并发登录(同一账号多个 tty 同时在线)
- 排查失败尝试:lastb 看来源与目标账号分布
常用命令
常用命令
# 完整时间戳与来源,按时间正序不易读,按用户查看更直观
last -Fai | head -30
# 只看指定用户,定位其全部会话
last -F -n 20 root
# 重启与关机记录,可用于时间线锚点
last -x reboot; last -x shutdown
# 读取轮转后的历史文件
last -f /var/log/wtmp.1 -F | tail -20
# 失败登录尝试
lastb -a | head -20
# 直接解码原始记录(保留写入顺序,便于核对条数)
utmpdump -r < /var/log/wtmp | tail -30last 输出逐列读法
| 列 | 含义 | 判读要点 |
|---|---|---|
| 用户名 | 登录账号 | reboot/shutdown 表示系统事件;空用户名多为登出记录 |
| 终端 | tty 或 pts 编号 | pts 为远程会话;同一 tty 反复出现说明复用 |
| 来源主机/IP | 登录来源 | 写 IP 说明反向解析失败;域名可能与实际不符 |
| 起止时间 | 登录与登出时刻 | still logged in 表示会话仍在;持续时间可看出停留长短 |
| (时长) | 会话长度 | 极短会话(几秒)常见于自动化脚本,也可能是探测 |
wtmp 被清空、时间出现倒退或大量条目消失,本身就是需要记录并解释的可疑现象。发现异常时立刻对该文件做只读副本并记录哈希,不要在原文件上继续操作。
部分较新发行版默认不维护 utmp,who 输出可能为空,但这不影响 wtmp 一般仍由 systemd-update-utmp 维护。判断前先确认发行版与 systemd 单元是否启用。