last 命令详解与参数实测(Ubuntu 22.04)
last 命令逐参数实测详解:默认输出的用户/终端/来源/时长字段解读、-n 条数限制与 0/负数不限量的真实行为、-a 主机名置尾、-F 完整时间、-R 隐藏主机名、-i/-d IP 显示与反解、-w 长用户名不截断、-x 关机与运行级、-s/-t 时间窗与合法格式、-p 指定时刻在线核对、-f 指定文件、--time-format 四种格式,附失败登录 lastb 审计实战,全部回显在 Ubuntu 22.04 实测通过。
last 命令详解与参数实测(Ubuntu 22.04)
目标:全面掌握 last 的每一个常用参数——默认输出的字段解读、
-n条数限制、-a主机名置尾、-F完整时间、-R隐藏主机名、-i/-dIP 显示与反解、-w长用户名不截断、-x关机与运行级条目、-s/-t时间窗过滤与合法时间格式、-p指定时刻在线核对、-f指定记录文件、--time-format四种时间格式,全部命令与回显已在 Ubuntu 22.04(util-linux 2.37.2)实测通过。
一、环境信息
本节记录实测环境与登录数据来源,便于读者对照复现。last 从 /var/log/wtmp 读取历史登录记录,是 Linux 上排查「谁在什么时候从哪里登录过、在线多久」的第一工具;它读取的是二进制记录文件,不能直接 cat,必须经由 last(或 lastb)解码输出。为了让 last 有真实数据可查,本次实测先在系统上安装并启动 sshd,再创建普通用户通过 SSH 真实登录、自然退出,从而在 wtmp 中留下真实的登录/登出记录。
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- last 版本:util-linux 2.37.2(软件包 util-linux 2.37.2-4ubuntu3.6,见 2.3 实测)
- 系统时区:UTC(回显中的时间均为 UTC,如
Thu Oct 15 08:46) - 远程接入:openssh-server(sshd 监听 22 端口),sshpass 自动化登录
- 登录记录文件:
/var/log/wtmp(成功登录历史,root:utmp 664)、/var/log/btmp(失败登录,root:utmp 660) - 演示目录:
/root/demo/last/(存放 wtmp 快照副本,供-f参数演示) - 测试用户:
u4b1(uid=1002)、u4b2(uid=1003),另有超长用户名u4b-01longuser专用于-w参数演示 - 登录方式:
sshpass -p <密码> ssh -tt u4b1@localhost真实登录;用完即退,共产生 9 条登录记录
四个登录记录文件的实测磁盘状态(后文参数演示都基于这份数据):
$ ls -l /var/log/wtmp /var/log/btmp /var/log/lastlog /run/utmp
-rw-rw-r-- 1 root utmp 1920 Oct 15 09:04 /run/utmp
-rw-rw---- 1 root utmp 1920 Oct 15 09:01 /var/log/btmp
-rw-rw-r-- 1 root utmp 584000 Oct 15 09:04 /var/log/lastlog
-rw-rw-r-- 1 root utmp 6912 Oct 15 08:59 /var/log/wtmp
每个文件各司其职:wtmp 只增不删(追加式归档)、btmp 记失败登录、lastlog 按用户记录最近一次成功登录、utmp 记录当前在线会话。
💡 技术拓展:登录记录「四件套」不止 wtmp 一个文件,横向对比——
文件 记录内容 写入时机 对应查看命令 /run/utmp 当前在线会话 登录时写入,登出时改写为空壳记录(DEAD_PROCESS) who、users、w /var/log/wtmp 历史登录/登出流水(含重启、运行级切换) 会话开始与结束时各追加一条 last /var/log/btmp 失败的登录尝试 认证失败时追加 lastb /var/log/lastlog 每个用户最近一次成功登录 成功登录时按 UID 定位覆盖写 lastlog 本文的 last 读取的是其中的
/var/log/wtmp;失败登录走姊妹命令 lastb(读 btmp),最近一次成功登录看 lastlog,当前在线用 who/users——四个工具各管一段,互不替代。
二、命令概览
2.1 语法与测试数据
last 的语法为:
last [options] [<username>...] [<tty>...]
除选项外,last 还接受位置参数做过滤:位置参数按「用户名 / 终端名」解释,可以同时给多个(实测见 3.14)。输出的默认排序是从新到旧——最新的登录在最上面。
为了让实测数据可解释,先交代 wtmp 里这 9 条记录的来历:08:46 三次短登录(u4b1、u4b2、u4b1 各一次,登入即退出);08:51 两次约 2 分钟的会话(u4b1、u4b2);08:57 三次短登录(u4b1 两次、u4b2 一次);08:59 一次长用户名登录(u4b-01longuser)。全量数据(-x 与默认输出在无系统条目时等价,实测见 3.9):
$ last -x
u4b-01lo pts/4 ::1 Thu Oct 15 08:59 - 08:59 (00:00)
u4b2 pts/8 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/7 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/6 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/6 ::1 Thu Oct 15 08:51 - 08:53 (00:02)
u4b2 pts/5 ::1 Thu Oct 15 08:51 - 08:53 (00:02)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
注意第一行用户名显示为 u4b-01lo——这是默认输出对用户名列的 8 字符截断,并非记录本身被截断(-w 可显示全名,实测见 3.8)。
2.2 --help 全量输出
以下为 last --help 的完整回显,逐行照抄(空行保留):
$ last --help
Usage:
last [options] [<username>...] [<tty>...]
Show a listing of last logged in users.
Options:
-<number> how many lines to show
-a, --hostlast display hostnames in the last column
-d, --dns translate the IP number back into a hostname
-f, --file <file> use a specific file instead of /var/log/wtmp
-F, --fulltimes print full login and logout times and dates
-i, --ip display IP numbers in numbers-and-dots notation
-n, --limit <number> how many lines to show
-R, --nohostname don't display the hostname field
-s, --since <time> display the lines since the specified time
-t, --until <time> display the lines until the specified time
-p, --present <time> display who were present at the specified time
-w, --fullnames display full user and domain names
-x, --system display system shutdown entries and run level changes
--time-format <format> show timestamps in the specified <format>:
notime|short|full|iso
-h, --help display this help
-V, --version display version
For more details see last(1).
选项分四类:控制条数(-n 与 -<number> 短格式)、控制列的显示方式(-a/-d/-i/-R/-w/-F/--time-format)、控制时间范围(-s/-t/-p)、控制数据源(-f)与系统条目(-x)。
2.3 版本信息
版本号、二进制归属与软件包版本三项一起核对:
$ last --version
last from util-linux 2.37.2
$ dpkg -S $(which last)
util-linux: /usr/bin/last
$ dpkg -l login util-linux coreutils 2>/dev/null | grep -E '^ii'
ii coreutils 8.32-4.1ubuntu1.4 amd64 GNU core utilities
ii login 1:4.8.1-2ubuntu2.2 amd64 system login tools
ii util-linux 2.37.2-4ubuntu3.6 amd64 miscellaneous system utilities
关键信息:Ubuntu 22.04 的 last 属于 util-linux 2.37.2(不是早年 bsdmainutils 的 last)。同属 util-linux 的还有 su;而 lastlog、login 属于 login 包(shadow),users 属于 coreutils——四个命令分属三个包,升级排查时别找错对象。
三、参数逐项实测
3.1 默认输出(无参数)与字段解读
不带任何参数执行 last,输出 wtmp 中全部记录(从新到旧)。此时 wtmp 中已有 3 条记录(08:46 的三次短登录):
$ last
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
每一列的含义如下:
| 列 | 示例值 | 含义 |
|---|---|---|
| 第 1 列 | u4b1 | 登录用户名(默认按 8 字符截断显示,见 3.8) |
| 第 2 列 | pts/4 | 登录终端。pts/N 为 SSH/图形等伪终端,tty1~tty6 为本机控制台 |
| 第 3 列 | ::1 | 登录来源。IPv6 回环地址(即本机连本机);本机控制台登录时此列显示空或 tty 名 |
| 第 4 列 | Thu Oct 15 08:46 | 登录时间 |
| 第 5 列 | - 08:46 | 登出时间(与登录时间同一天时省略日期) |
| 第 6 列 | (00:00) | 会话时长(时:分) |
| 末行 | wtmp begins ... | 记录文件起始时间(由文件时间戳推出),表示「wtmp 从这一刻开始有记录」 |
💡 说明:
(00:00)表示该会话时长不足 1 分钟——登录后立即exit,登入与登出落在同一分钟内。若会话还未结束,第 5、6 列会显示still logged in(实测见 5 节 Q5)。
3.2 -n / -<number>:限制输出条数
-n <数字> 只显示最新 N 条,等价短格式是把数字直接当选项写(如 -2)。取 2 条:
$ last -n 2
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
与位置参数过滤组合(只看 u4b2 的最近 1 条):
$ last u4b2 -n 1
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
一个反直觉的实测行为:-n 0 和负数不会报错,也不会输出空,而是等价于「不限条数」全量输出:
$ last -n 0
u4b-01lo pts/4 ::1 Thu Oct 15 08:59 - 08:59 (00:00)
u4b2 pts/8 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/7 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/6 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/6 ::1 Thu Oct 15 08:51 - 08:53 (00:02)
u4b2 pts/5 ::1 Thu Oct 15 08:51 - 08:53 (00:02)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
$ last -n -5
u4b-01lo pts/4 ::1 Thu Oct 15 08:59 - 08:59 (00:00)
u4b2 pts/8 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/7 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/6 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/6 ::1 Thu Oct 15 08:51 - 08:53 (00:02)
u4b2 pts/5 ::1 Thu Oct 15 08:51 - 08:53 (00:02)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
💡 要点:想用变量控制条数时(如
last -n $N),N 为 0 或负数会静默变成全量输出而不是空结果——脚本里判断「今天是否有登录」不要依赖-n 0,应配合-s时间过滤。
3.3 -a --hostlast:主机名置尾
默认来源主机名在第 3 列,排在用户名和终端之间;-a 把主机名挪到行尾。长用户名或长主机名场景下行不容易错位:
$ last -n 1 -a
u4b1 pts/4 Thu Oct 15 08:46 - 08:46 (00:00) ::1
wtmp begins Thu Oct 15 08:46:34 2026
与 -F 组合使用(实战见 4.1)是最常用的审计姿势:时间完整、来源在行尾,便于 awk '{print $NF}' 直接提取来源列。
3.4 -F --fulltimes:完整时间
默认时间只到分钟、登出时间省略日期;-F 输出登录与登出的完整日期+秒级时间,跨天会话、审计对账时必开:
$ last -F
u4b1 pts/4 ::1 Thu Oct 15 08:46:36 2026 - Thu Oct 15 08:46:36 2026 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46:35 2026 - Thu Oct 15 08:46:35 2026 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46:34 2026 - Thu Oct 15 08:46:34 2026 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
💡 要点:三条记录的秒级时间 34/35/36 秒也清晰可辨——这正是默认格式(只到分钟)看不出、而
-F能看出的信息。
3.5 -R --nohostname:隐藏主机名列
-R 不显示来源主机列,输出更紧凑;不需要来源信息时(如只统计登录时段)可减少干扰:
$ last -R
u4b1 pts/4 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
3.6 -i --ip:以数字显示 IP 地址
-i 强制来源列显示数字形式的 IP。本环境中记录里存的本就是 ::1(数字形式),所以输出与默认一致:
$ last -i
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
它的价值在于:当来源主机名可被反向解析时,默认输出会显示主机名,而 -i 始终显示 IP 数字,避免主机名干扰、便于 grep 网段。
3.7 -d --dns:把 IP 反解回主机名
-d 对来源做反向 DNS 解析,把 IP 翻译成主机名。::1 被解析为 localhost:
$ last -d
u4b1 pts/4 localhost Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 localhost Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 localhost Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
⚠️ 注意:
-d依赖当前时点的 DNS/hosts 解析能力,解析不了时仍显示 IP;对大量外网 IP 做反解会产生 DNS 查询延迟,批量审计时先取 IP(-i)再离线反解更稳妥。
3.8 -w --fullnames:完整用户名与域名
默认输出把用户名列按 8 字符截断(wtmp 二进制里存的是全名,只是显示被截了)。用 13 字符的用户名 u4b-01longuser 登录一次后对比:默认显示 u4b-01lo,-w 显示全名:
$ last -n 1
u4b-01lo pts/4 ::1 Thu Oct 15 08:59 - 08:59 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
$ last -w -n 1
u4b-01longuser pts/4 ::1 Thu Oct 15 08:59 - 08:59 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
💡 要点:截断只影响显示,不影响位置参数过滤——
last u4b-01longuser依然能精确匹配到这条记录。需要复制用户名做后续处理时记得加-w。
3.9 -x --system:显示关机与运行级条目
-x 在用户记录之外,额外显示系统关机条目(shutdown)与运行级切换(runlevel)。本环境自 wtmp 有记录以来没有发生过关机/重启,所以 -x 输出与默认一致(9 条用户记录,见 2.1);对应地,按用户名过滤 reboot 也没有结果:
$ last reboot
wtmp begins Thu Oct 15 08:46:34 2026
$ last shutdown
wtmp begins Thu Oct 15 08:46:34 2026
$ last -x
u4b-01lo pts/4 ::1 Thu Oct 15 08:59 - 08:59 (00:00)
u4b2 pts/8 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/7 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/6 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/6 ::1 Thu Oct 15 08:51 - 08:53 (00:02)
u4b2 pts/5 ::1 Thu Oct 15 08:51 - 08:53 (00:02)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
reboot 行的含义(长期运行的真实服务器上常见):系统每次启动/关机时,init 会往 wtmp 写入特殊条目——用户名显示为 reboot、终端列显示为 ~,来源/时间列记录内核启动时间;正常关机对应一条成对的 shutdown 记录,非正常断电则表现为 reboot 行「起始时间在上一条会话结束之前」或时长列显示 crash。last reboot 因此也是估算系统最近一次开机时间、统计历史重启次数的惯用命令。
3.10 -s --since / -t --until:时间范围过滤
-s 显示指定时刻之后的记录,-t 显示指定时刻之前的记录,两者可组合成时间窗。只给日期(2026-10-15 当天起):
$ last -s 2026-10-15
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
日期+时刻组合成闭区间时间窗(08:45 至 08:47 之间):
$ last -s '2026-10-15 08:45' -t '2026-10-15 08:47'
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
支持相对时间(1 天前至今):
$ last -s -1days
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
$ last -s yesterday
u4b1 pts/6 ::1 Thu Oct 15 08:51 - 08:53 (00:02)
u4b2 pts/5 ::1 Thu Oct 15 08:51 - 08:53 (00:02)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
也接受只给时刻(默认按当天解释):
$ last -s '08:45' -n 2
u4b2 pts/8 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/7 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
时间早于所有记录时不报错、输出为空(合法但无匹配):
$ last -t '2026-10-14'
wtmp begins Thu Oct 15 08:46:34 2026
无法识别的紧凑格式会直接报错,这也是最容易踩的坑(8 位与 12 位紧凑格式均不被 2.37.2 接受):
$ last -t 20261014
last: invalid time value "20261014"
$ last -t 202610140000
last: invalid time value "202610140000"
$ last -s 202610150845
last: invalid time value "202610150845"
💡 要点:在本版本(util-linux 2.37.2)实测中,可靠的时间写法是带连字符/空格的「
YYYY-MM-DD」「YYYY-MM-DD hh:mm」「hh:mm」与相对形式「-1days」「yesterday」;老教程里的YYYYMMDDhhmm紧凑格式会报 invalid time value。时间过滤是按登录时刻匹配,不是按会话是否覆盖该时刻(后者用-p,见 3.11)。
3.11 -p --present:指定时刻谁在线
-p 回答「某个时刻谁正挂着会话」——匹配的是登录时间到登出时间覆盖该时刻的记录,未结束的会话显示 still logged in。查 08:55 时(u4b1/u4b2 两个长会话正在进行中):
$ last -p '2026-10-15 08:55'
u4b1 pts/6 ::1 Thu Oct 15 08:51 still logged in
u4b2 pts/5 ::1 Thu Oct 15 08:51 still logged in
wtmp begins Thu Oct 15 08:46:34 2026
与用户过滤组合,查 08:58 时 u4b2 是否在线:
$ last -p '2026-10-15 08:58' u4b2
u4b2 pts/5 ::1 Thu Oct 15 08:51 still logged in
wtmp begins Thu Oct 15 08:46:34 2026
只给日期等价于「当天 00:00」这一时刻——那时还没有任何会话,所以为空:
$ last -p 2026-10-15
wtmp begins Thu Oct 15 08:46:34 2026
💡 要点:
-s/-t是「记录的登录时刻落在窗内」,-p是「会话覆盖该时刻」,两者语义不同。用-p做「某时刻在线名单」时,时刻必须带hh:mm,只写日期会得到当天零点的快照。
3.12 -f --file:指定记录文件
-f 换一个记录文件,默认是 /var/log/wtmp。显式指定默认文件:
$ last -f /var/log/wtmp -n 3
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
读取事先复制好的快照副本(演练/取证时不污染原文件的操作习惯):
$ ls -l /root/demo/last /root/demo/lastlog /root/demo/users /root/demo/su
/root/demo/last:
total 8
-rw-r--r-- 1 root root 7680 Oct 15 09:07 wtmp-snapshot
/root/demo/lastlog:
total 60
-rw-r--r-- 1 root root 584000 Oct 15 09:07 lastlog-snapshot
/root/demo/su:
total 0
/root/demo/users:
total 4
-rw-r--r-- 1 root root 1920 Oct 15 09:07 utmp-snapshot
$ last -f /root/demo/last/wtmp-snapshot -F -n 3
u4a-ssh pts/6 ::1 Thu Oct 15 09:06:20 2026 still logged in
u4a-ssh pts/5 ::1 Thu Oct 15 09:06:20 2026 still logged in
u4b-01lo pts/4 ::1 Thu Oct 15 08:59:58 2026 - Thu Oct 15 08:59:58 2026 (00:00)
wtmp-snapshot begins Thu Oct 15 08:46:34 2026
💡 要点:快照是复制出来的文件,last 一样能读,且末行的文件名提示会跟随
-f的文件名变化(wtmp-snapshot begins ...)。生产上 wtmp 若被 logrotate 归档为wtmp.1,同样用last -f /var/log/wtmp.1查更早的历史。
3.13 --time-format:四种时间格式
--time-format 接受 notime|short|full|iso 四种格式。short 即默认格式;iso 输出 ISO 8601 带时区偏移,最适合程序解析:
$ last --time-format iso
u4b1 pts/4 ::1 2026-10-15T08:46:36+00:00 - 2026-10-15T08:46:36+00:00 (00:00)
u4b2 pts/4 ::1 2026-10-15T08:46:35+00:00 - 2026-10-15T08:46:35+00:00 (00:00)
u4b1 pts/4 ::1 2026-10-15T08:46:34+00:00 - 2026-10-15T08:46:34+00:00 (00:00)
wtmp begins 2026-10-15T08:46:34+00:00
full 与 -F 等价:
$ last --time-format full -n 2
u4b1 pts/4 ::1 Thu Oct 15 08:46:36 2026 - Thu Oct 15 08:46:36 2026 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46:35 2026 - Thu Oct 15 08:46:35 2026 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
notime 干脆隐藏时间列,只看谁在什么时候段外还有哪些终端记录(常用于快速清点用户/终端组合):
$ last -n 1 --time-format notime
u4b2 pts/8 ::1 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
3.14 位置参数:按用户/终端过滤
位置参数可以直接给用户名(3.2 已演示单个),也可以给终端名,且可以同时给多个,输出为这些过滤条件的合集(按时间排序后取前 N 条)。按用户名 u4b1 过滤:
$ last u4b1
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
按终端 pts/4 过滤(该终端上先后有 u4b1、u4b2、u4b1 三次登录):
$ last pts/4
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
多个位置参数同时给出(u4b1 与 u4b2 合集的最近 3 条;比它们更新的其他用户记录被过滤掉,不占 -n 名额):
$ last u4b1 u4b2 -n 3
u4b2 pts/8 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/7 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
u4b1 pts/6 ::1 Thu Oct 15 08:57 - 08:57 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
四、实战示例
4.1 场景一:账号登录轨迹审计(-a + -F + 用户过滤)
运维收到「u4b1 账号行为异常」的告警,需要完整还原该账号的登录轨迹。用用户过滤拿全量记录,-F 取秒级时间,-a 把来源放到行尾方便提取:
$ last -a -F -n 4 u4b1
u4b1 pts/7 Thu Oct 15 08:57:14 2026 - Thu Oct 15 08:57:20 2026 (00:00) ::1
u4b1 pts/6 Thu Oct 15 08:57:14 2026 - Thu Oct 15 08:57:20 2026 (00:00) ::1
u4b1 pts/6 Thu Oct 15 08:51:45 2026 - Thu Oct 15 08:53:50 2026 (00:02) ::1
u4b1 pts/4 Thu Oct 15 08:46:36 2026 - Thu Oct 15 08:46:36 2026 (00:00) ::1
wtmp begins Thu Oct 15 08:46:34 2026
结论可直接读出:该账号 11 分钟内 4 次登录全部来自 ::1(本机),其中 08:51 那次会话持续 2 分钟,其余是登入即退的短连接——来源单一、无异地 IP,可初步排除爆破成功。
4.2 场景二:时间窗取证(-s + -t)
安全事件要求核对「2026-10-15 08:45 到 08:47 之间谁登录过」:
$ last -s '2026-10-15 08:45' -t '2026-10-15 08:47'
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b2 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
u4b1 pts/4 ::1 Thu Oct 15 08:46 - 08:46 (00:00)
wtmp begins Thu Oct 15 08:46:34 2026
窗口内的 3 条记录全部命中。若窗口两端需要跨天,-s/-t 各自给完整日期即可。
4.3 场景三:失败登录审计(lastb,读 /var/log/btmp)
last 只看得到成功的登录;失败的尝试(爆破、密码敲错)记录在 /var/log/btmp,用姊妹命令 lastb 查看。本环境此前在做 su 密码错误实验时留下了 4 条失败记录(详见《su 命令详解与参数实测(Ubuntu 22.04)》的错误密码实测):
$ lastb -n 4
u4b2 pts/3 Thu Oct 15 09:01 - 09:01 (00:00)
u4b2 pts/3 Thu Oct 15 08:57 - 08:57 (00:00)
u4b2 pts/3 Thu Oct 15 08:55 - 08:55 (00:00)
u4b2 pts/3 Thu Oct 15 08:55 - 08:55 (00:00)
btmp begins Thu Oct 15 08:41:55 2026
$ lastb | wc -l
7
注意两处细节:失败记录没有来源列与用户名截断差异(第 3 列为空表示来源未记录);lastb | wc -l 得到 7 = 6 条记录 + 1 行 btmp begins 尾注,管道统计行数时要扣掉。另外 btmp 权限是 root:utmp 的 660,普通用户读不了:
$ su u4b1 -c 'lastb'
lastb: cannot open /var/log/btmp: Permission denied
4.4 场景四:在线状态核对(-p 与 who 互相印证)
「用户说 08:55 他还在线」这类争议,用 -p 还原当时快照,再与当前实况对照。08:55 的快照(见 3.11)显示 u4b1、u4b2 均在线;当时的实时工具 who 也应显示同样的两条会话(下面是同一时段 who 的实测输出):
$ who
u4b1 pts/6 Oct 15 08:57 (::1)
u4b1 pts/7 Oct 15 08:57 (::1)
u4b2 pts/8 Oct 15 08:57 (::1)
-p 源于历史归档(wtmp),who 源于实时文件(utmp),两者交叉印证时以「时间点 + 终端号」对齐。
4.5 场景五:审计前先固化快照(-f 读副本)
审计要求「不得改动原始证据」:先把 wtmp 复制为只读副本,后续所有查询都指向副本,原始文件保持访问原样:
mkdir -p /root/demo/last
cp /var/log/wtmp /root/demo/last/wtmp-snapshot
last -f /root/demo/last/wtmp-snapshot -a -F -n 5
输出格式与读原文件完全一致,末行文件名提示变为 wtmp-snapshot begins ...(完整回显见 3.12)。这个模式同样适用于跨机取证:把 wtmp 拷回审计机后用 -f 离线分析。
五、注意事项与常见问题
Q1:last 执行后除 wtmp begins 外一片空白,是不是坏了?
不是。wtmp begins <时间> 只表示文件从该时刻开始有记录;空白说明这之后没有任何登录/登出被写入。实测中最常见的原因有三个:一是系统刚装好无人登录过;二是服务端没有可写会话(SSH 以 ssh host 'command' 方式执行远程命令时不分配伪终端,不产生 wtmp 记录——本组实测曾用这种方式登录成功但 wtmp 始终为 0 字节,改用 ssh -tt 分配 TTY 后记录立刻出现);三是 /var/log/wtmp 不存在或属主/权限错误(应为 root:utmp 可写),此时写入方会静默失败。
Q2:last -s 202610150845 报 invalid time value,明明是老教程里的写法?
util-linux 2.37.2 实测不接受 8/12 位紧凑数字格式,请改用带分隔符写法:last -s '2026-10-15 08:45'、last -s '08:45'、相对时间 last -s -1days、last -s yesterday(均实测通过,见 3.10)。
Q3:为什么 last reboot 查不到任何记录?
本机自 wtmp 建立以来没有发生过重启(实测输出为空,见 3.9)。reboot 条目由系统在启动/关机时写入,只有真实发生过重启的机器才有;新装机上为空属正常,不要误判为文件损坏。
Q4:wtmp 会无限变大吗?怎么管理?
会。wtmp 是追加式文件,长期运行的服务器上应交给 logrotate 轮转(按月轮转、保留归档并压缩)。本实测环境较小、/etc/logrotate.d/ 下暂无 wtmp 配置项;生产服务器上归档出的 wtmp.1、wtmp.2.gz 等文件,用 last -f /var/log/wtmp.1(gz 归档需先解压)即可翻查更早历史,-f 能力已在 3.12 实测。
Q5:用户明明已经断开,为什么还显示 still logged in?
会话被异常终止(网络断连、进程被杀)时,登出事件可能没来得及写进 wtmp,该记录就永久停留在 still logged in 状态;另一种常见标记是 gone - no logout。判断真实在线请以 who/w(读 utmp 实时文件)为准,-p 也只能还原 wtmp 记录到的状态。
Q6:来源列显示的是主机名还是 IP?能信任吗?
默认显示 wtmp 里记录的形式:远程登录记录 IP 或主机名,-i 强制数字 IP、-d 尝试反解主机名(均实测)。注意反解发生在查询时刻,当前 DNS 状态可能与登录时不同;做安全结论时以 -i 的 IP 为准。
Q7:-n 0 想输出「空结果」为什么反而全量输出了?
实测 -n 0 与负数等价于不限制条数(见 3.2),不是「输出 0 条」。脚本中不要用 -n 0 当「清空」语义使用。
Q8:同一用户同一终端出现两条一模一样的记录是重复吗? 不是重复,是两次独立登录(实测 08:46 时 u4b1 在 pts/4 上登录了两次,见 3.1)。SSH 每建立一次会话就新开一个 pts 编号或复用已释放的编号,按「登录时间 + 会话时长」区分即可。
六、参考链接
- last(1) 手册页(man7.org):https://man7.org/linux/man-pages/man1/last.1.html
- Ubuntu 22.04 (jammy) last 手册页:https://manpages.ubuntu.com/manpages/jammy/en/man1/last.1.html
- utmp/wtmp/btmp 记录格式(utmp(5)):https://man7.org/linux/man-pages/man5/utmp.5.html
- lastb 说明(同 last 手册页内):https://man7.org/linux/man-pages/man1/lastb.1.html
- util-linux 上游源码仓库:https://github.com/util-linux/util-linux
- 姊妹篇:《lastlog 命令详解与参数实测(Ubuntu 22.04)》《users 命令详解与参数实测(Ubuntu 22.04)》