命令概述
last 命令用于显示系统最近登录(包括重启和运行级别变更)的用户列表。它从 /var/log/wtmp、/var/log/btmp 等日志文件中读取信息。
基本语法
常用选项
1. 基本显示选项
# 显示所有登录记录
last
# 显示指定用户的登录记录
last username
# 显示指定终端的登录记录
last tty1
last pts/0
2. 限制显示行数 (-n)
# 显示最近10条记录
last -n 10
# 同上
last --limit 10
3. 指定时间格式 (-F)
默认只显示月、日、时间,-F 会显示年、月、日、时分秒。
4. 显示主机名 (-d)
5. 读取特定文件 (-f)
# 读取失败登录记录
last -f /var/log/btmp
# 读取归档的wtmp文件
last -f /var/log/wtmp.1
6. 不显示主机名字段 (-R)
7. 显示运行级别变更 (-x)
8. 显示系统启动和关机 (-t)
# 显示指定时间之后的记录
last -t yyyymmddHHMMSS
输出格式详解
标准输出格式:
用户名 终端 来源IP/主机 登录时间 退出时间 持续时间
root pts/0 192.168.1.100 Mon Jan 15 09:00 still logged in
user1 tty1 Mon Jan 15 08:30 Mon Jan 15 17:30 (09:00)
reboot system boot 4.18.0-477 Mon Jan 15 08:25 Mon Jan 15 17:35 (09:10)
各字段含义:
-
用户名 - 登录用户或系统事件(reboot/shutdown)
-
终端 - 登录终端
-
ttyN - 物理控制台
-
pts/N - SSH/telnet伪终端
-
system boot - 系统启动
-
runlevel - 运行级别变更
-
来源IP/主机 - 远程登录的主机IP或主机名
-
登录时间 - 登录开始时间
-
退出时间 - 退出时间(still logged in 表示仍在登录)
-
持续时间 - 会话持续时间
常用查询示例
示例1:查看最近登录记录
# 查看最近20条登录记录
last -n 20
# 查看完整时间格式的最近登录
last -F -n 5
示例2:查看系统重启记录
# 查看所有重启记录
last reboot
# 查看最近5次重启
last reboot -n 5
# 查看包含运行级别变更的记录
last -x | grep -E "reboot|shutdown|runlevel"
示例3:查看特定用户登录历史
# 查看root用户的登录历史
last root
# 查看特定用户从特定终端的登录
last user1 pts/0
示例4:查看失败登录尝试
# 需要root权限
sudo last -f /var/log/btmp
# 查看特定用户的失败登录
sudo last -f /var/log/btmp username
# 查看所有失败登录(简写)
sudo lastb
示例5:时间范围查询
# 查看今天的所有登录
last -s today
# 查看昨天到今天的所有登录
last -s yesterday -t today
# 查看指定日期之后的登录
last -s "2024-01-15 00:00:00"
# 查看最近7天的登录
last -s "-7days"
特殊文件说明
1. wtmp 文件
2. btmp 文件
3. utmp 文件
-
路径:/var/run/utmp
-
内容:当前登录的用户信息
-
查看命令:who、w
实用技巧和组合命令
1. 统计登录次数
# 统计每个用户的登录次数
last | grep -v "^$" | grep -v "reboot" | grep -v "wtmp" | awk '{print $1}' | sort | uniq -c | sort -rn
# 统计每个IP的登录次数
last | awk '{print $3}' | grep -E "^[0-9]" | sort | uniq -c | sort -rn
2. 查找异常登录
# 查找非工作时间登录(晚上10点到早上6点)
last | awk '$5 ~ /^2[2-3]:|^0[0-6]:/{print}'
# 查找登录时间过短的会话(可能为异常)
last | awk '{if ($NF ~ /\(.*\)/) {split($NF,a,"[()]"); if (a[2]!="still" && a[2]!="down") print}}'
3. 生成登录报告
#!/bin/bash
echo "=== 最近登录统计报告 ==="
echo "生成时间: $(date)"
echo ""
echo "1. 最近10次登录记录:"
last -n 10
echo -e "\n2. 最近5次重启记录:"
last reboot -n 5
echo -e "\n3. 用户登录次数统计:"
last | grep -v "^$" | grep -v "reboot" | grep -v "wtmp" | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
echo -e "\n4. 最近失败登录尝试:"
sudo lastb -n 10 2>/dev/null || echo "需要root权限"
4. 监控实时登录
# 监控新登录(需要inotify-tools)
sudo tail -f /var/log/auth.log | grep -i "accepted\|session opened"
# 或者使用watch命令定期检查
watch -n 10 "last -n 5"
与其他命令对比
注意事项和常见问题
1. 权限要求
2. 文件轮转和清理
# 手动轮转日志
logrotate -f /etc/logrotate.conf
# 清空wtmp文件(谨慎操作!)
> /var/log/wtmp
# 查看所有可用的wtmp文件
ls -la /var/log/wtmp*
3. 时区问题
# 查看系统时区
timedatectl
# 如果时间不对,可以设置时区
sudo timedatectl set-timezone Asia/Shanghai
4. 常见错误处理
# 如果出现"wtmp begins"且没有记录
# 可能是wtmp文件被清空或损坏
sudo touch /var/log/wtmp
sudo chmod 644 /var/log/wtmp
sudo chown root:utmp /var/log/wtmp
实际应用场景
场景1:安全审计
# 检查是否有异常登录模式
# 1. 检查非工作时间登录
last | grep -E "2[2-3]:|0[0-6]:" | grep -v reboot
# 2. 检查来自陌生IP的登录
last | awk '{print $3}' | sort -u
场景2:用户活动分析
# 分析用户活动模式
echo "=== 用户活动分析 ==="
echo "1. 最活跃用户:"
last | grep -v reboot | grep -v wtmp | awk '{print $1}' | sort | uniq -c | sort -rn | head -5
echo -e "\n2. 平均会话时长:"
last | grep -v "still logged in" | grep -v "down" | grep -v reboot | grep -v wtmp |
awk '{gsub(/[()]/,"",$NF); if($NF+0>0) {sum+=$NF; count++}} END {print "平均:", sum/count/60 "分钟"}'
场景3:系统维护记录
# 查看系统维护记录
last -x | grep -E "shutdown|reboot" | head -20
last 命令是系统管理员进行安全审计、故障排查和用户监控的重要工具。配合其他命令如 grep、awk、sort 等,可以完成复杂的日志分析任务。