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 实测通过。

Linux命令Linux系统UbuntuUbuntu 22.04命令行用户权限2026/10/15

last 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 last 的每一个常用参数——默认输出的字段解读、-n 条数限制、-a 主机名置尾、-F 完整时间、-R 隐藏主机名、-i/-d IP 显示与反解、-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 编号或复用已释放的编号,按「登录时间 + 会话时长」区分即可。

六、参考链接