Linux last 命令

last 命令用于显示系统最近的登录记录,包括用户登录、重启和关机等信息

语法格式

last [选项] [用户名] [终端设备]

常用选项

选项 说明
-n 数字--limit 数字 限制显示的行数
-R 不显示主机名字段
-a 在最后一列显示主机名
-d 显示登录IP对应的主机名
-i--ip 以数字形式显示IP地址
-x 显示系统关机、重启和运行等级变更记录
-f 文件 指定替代的日志文件
-t YYYYMMDDHHMMSS 显示指定时间之前的记录
--since 时间 显示指定时间之后的记录
--until 时间 显示指定时间之前的记录
-w 显示完整的用户名和主机名
-F 显示完整的登录和登出时间

数据源文件

last 命令读取以下文件:

  • /var/log/wtmp - 主要数据源,记录所有登录/登出信息
  • /var/log/btmp - 失败的登录尝试记录
  • /var/run/utmp - 当前登录用户信息

注意:这些文件是二进制格式,不能直接使用文本编辑器查看

命令示例

示例1:查看最近的登录记录

显示最近的登录记录(默认显示所有记录):

last

输出格式:

用户名   终端设备      登录IP/主机名          登录时间                     登出时间
root     pts/0        192.168.1.100         Mon Mar 11 09:30:01 2024   still logged in
john     tty1                           Tue Mar 10 14:22:15 2024   Tue Mar 10 18:45:22 2024
示例2:限制显示行数

只显示最近10条登录记录:

last -n 10

或者使用简写:

last -10
示例3:查看特定用户的登录记录

查看用户"john"的登录记录:

last john

查看多个用户的登录记录:

last john root admin
示例4:查看系统重启和关机记录

使用 -x 选项查看系统事件:

last -x

只查看重启记录:

last -x reboot

只查看关机记录:

last -x shutdown
系统事件记录包括:reboot(重启)、shutdown(关机)、runlevel(运行等级变更)
示例5:显示完整的日期时间信息

使用 -F 选项显示完整的登录/登出时间:

last -F

输出示例:

root     pts/0        192.168.1.100         Mon Mar 11 09:30:01 2024   still logged in
                                                                    (00:15:22)
示例6:查看失败的登录尝试

使用 lastb 命令查看失败的登录尝试:

lastb

限制显示行数:

lastb -n 20
注意:lastb 通常需要root权限才能执行
示例7:查看指定时间范围内的记录

查看今天以来的登录记录:

last --since today

查看过去24小时内的记录:

last --since yesterday

查看指定日期之后的记录:

last --since "2024-03-01"

查看指定日期范围内的记录:

last --since "2024-03-01" --until "2024-03-10"

实际应用场景

场景1:安全审计和监控

监控可疑登录活动:

# 查看最近的非工作时间登录
last -a | grep -E "(22:|23:|00:|01:|02:|03:|04:|05:|06:)" | head -20

# 查看来自特定IP的登录
last -i | grep "192.168.1.100"

# 检查root用户的远程登录
last root | grep -E "pts/|tty" | head -10
场景2:用户登录统计

统计用户登录次数和时长:

# 统计每个用户的登录次数
last | grep -v "reboot\|shutdown\|wtmp" | awk '{print $1}' | sort | uniq -c | sort -nr

# 计算用户总登录时长
last -F | grep -v "reboot\|shutdown\|wtmp" | awk '{if($7!="still") print $1,$5,$6,$7,$8,$9}' | head -20
场景3:服务器维护记录

查看服务器重启和关机历史:

# 查看最近10次重启记录
last -x reboot -n 10

# 查看最近5次关机记录
last -x shutdown -n 5

# 查看系统运行时间(结合uptime)
uptime
echo "最近重启记录:"
last reboot -n 3

last命令家族

命令 功能 数据源
last 显示成功登录记录 /var/log/wtmp
lastb 显示失败登录尝试 /var/log/btmp
lastlog 显示每个用户最近一次登录 /var/log/lastlog
who 显示当前登录用户 /var/run/utmp
w 显示当前登录用户及活动 /var/run/utmp
users 显示当前登录用户名 /var/run/utmp

常见问题解答

当显示"wtmp begins [日期]"时,表示这是日志文件中最早可用的记录。这通常是因为:

  1. 系统日志轮转,旧的日志被压缩或删除
  2. wtmp文件被清空
  3. 系统是新安装的

要查看更多历史记录,可以查看归档的日志:

# 查看压缩的日志文件
sudo last -f /var/log/wtmp.1

# 查看系统日志轮转配置
cat /etc/logrotate.conf

注意:清除登录记录可能违反安全策略,仅在必要时操作。

清除wtmp文件:

# 清空wtmp文件(需要root权限)
sudo truncate -s 0 /var/log/wtmp

# 或使用特定工具
sudo lastlog -b

清除btmp文件(失败登录记录):

sudo truncate -s 0 /var/log/btmp

清除后,系统会重新开始记录。

last:显示所有用户的登录记录(按时间倒序),包括登录时间、登出时间、终端、IP地址等信息。

lastlog:显示每个用户最近一次的登录时间,无论这个登录发生在什么时候。

示例对比:

# last - 显示所有登录记录
last -n 5

# lastlog - 显示每个用户的最近登录
lastlog | head -10

SSH登录通常通过pts终端,可以筛选这些记录:

# 查看所有pts终端登录(通常是SSH)
last | grep "pts/"

# 查看特定时间段内的SSH登录
last --since "2024-03-10" | grep "pts/"

# 查看SSH登录的IP地址统计
last -i | grep "pts/" | awk '{print $3}' | sort | uniq -c | sort -nr

也可以查看SSH服务的专门日志:

# 查看SSH登录日志
sudo tail -f /var/log/auth.log | grep sshd
# 或对于RHEL/CentOS
sudo tail -f /var/log/secure | grep sshd

日志文件管理

日志轮转配置

了解系统的日志轮转机制有助于管理登录记录:

# 查看wtmp的日志轮转配置
cat /etc/logrotate.d/wtmp

# 手动执行日志轮转
sudo logrotate -f /etc/logrotate.conf

# 查看归档的日志文件
ls -lh /var/log/wtmp*
ls -lh /var/log/btmp*

通常,wtmp和btmp文件会定期轮转(如每月),旧的日志会被压缩保存。