lastb 列出登录失败记录,数据来自 /var/log/btmp——专记失败登录的二进制日志。排查 SSH 爆破、确认”最近谁在尝试登录”,从这条命令开始。以下用法与行为在 Rocky 9 容器实测:起了一台 sshd,用错误密码真实打了几次登录,输出全部来自这次复现。

基本用法

直接执行,每行一次失败登录:用户名、终端、来源地址、时间。容器里对 root 和 admin 各打一次错误密码,lastb 如实记下:

配图1

ssh:notty 表示 SSH 登录未获得终端,是爆破的典型特征——正常的交互登录会有 pts/N 终端名。来源列 ::1 是 IPv6 的 localhost,换成真实爆破场景,这一列就是形形色色的陌生公网 IP。

常用选项

选项 作用 示例
-n N / -N 只显示最近 N 条(-1 是简写) lastb -n 5
-d IP 反解成主机名(查 PTR) lastb -d
-a 主机名列放到最后 lastb -a
-F 显示完整起止日期时间 lastb -F
-s / -t 按起始/截止时间过滤 lastb -s 20240101000000
-f FILE 读其他文件(如轮转后的 btmp.1) lastb -f /var/log/btmp.1
-R 不显示主机名列 lastb -R

排查习惯:先 lastb -n 20 看最近的来源 IP,再统计高频来源。注意统计管道有个实测出来的小坑——lastb 输出末尾的 btmp begins ... 尾行会混进结果(配图2 里多出来的 1 btmp 就是它)。用 -n 限条数既能避开尾行,也能防止大文件刷屏,比裸管道更稳:

配图2

相关日志文件与命令

btmp 只记失败登录,登录日志是一组文件,各有分工:

文件 内容 对应命令
/var/log/btmp 仅登录失败 lastb
/var/log/wtmp 历史+当前登录(utmp 的归档) last
/var/run/utmp 当前在线用户、开机时间 uptime、who

另有两个相关命令:

命令 一句话作用
lastlog 每个用户最近一次登录的时间与来源
utmpdump 把 btmp/wtmp 二进制转成文本(反向 -r 可写回)

分不清两条记录走了哪个账,用实测对照记:错误密码的尝试进 btmp(lastb 可见),成功登录进 wtmp(last 可见)。配图2 里 testu 成功登录后 last 出现 pts/1 记录,和 lastb 里的 ssh:notty 形成对照。

陷阱提示

  • btmp 可能非常大:爆破严重的机器上几天就能堆出上 GB,先 -n 限条数,别全量输出到终端。
  • 需要 root 权限:btmp 默认 0660 root:utmp(实测 stat -c '%a %U:%G' 确认),普通用户跑 lastb 读不到数据。
  • 统计别忘尾行:btmp begins ... 尾行和末尾空行会混进 awk 统计,-n 限条数或先 grep -v '^btmp' 再统计。
  • 失败多 ≠ 被入侵:公网机器有失败记录是常态,持续的陌生 IP 高频失败才值得处理——配上 fail2ban 之类的自动封禁,并检查 last 确认有没有成功登录。

本文由作者 2020-2024 年间的 CSDN 博客文章重构而来,原发布于 CSDN。