Linux常用命令(2) - last

命令概述

last 命令用于显示系统最近登录(包括重启和运行级别变更)的用户列表。它从 /var/log/wtmp/var/log/btmp 等日志文件中读取信息。

基本语法

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

常用选项

1. 基本显示选项

# 显示所有登录记录
last

# 显示指定用户的登录记录
last username

# 显示指定终端的登录记录
last tty1
last pts/0

2. 限制显示行数 (-n)

# 显示最近10条记录
last
-n 10
# 同上
last --limit 10

3. 指定时间格式 (-F)

# 显示完整的日期和时间
last -F

默认只显示月、日、时间,-F 会显示年、月、日、时分秒。

4. 显示主机名 (-d)

# 将IP地址解析为主机名
last -d

5. 读取特定文件 (-f)

# 读取失败登录记录
last -f /var/log/btmp
# 读取归档的wtmp文件
last -f /var/log/wtmp.1

6. 不显示主机名字段 (-R)

# 紧凑格式,不显示主机名列
last -R

7. 显示运行级别变更 (-x)

# 显示关机、重启、运行级别变更
last -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)

各字段含义:

  1. 用户名 - 登录用户或系统事件(reboot/shutdown)

  2. 终端 - 登录终端

    • ttyN - 物理控制台

    • pts/N - SSH/telnet伪终端

    • system boot - 系统启动

    • runlevel - 运行级别变更

  3. 来源IP/主机 - 远程登录的主机IP或主机名

  4. 登录时间 - 登录开始时间

  5. 退出时间 - 退出时间(still logged in 表示仍在登录)

  6. 持续时间 - 会话持续时间

常用查询示例

示例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 文件

  • 路径:/var/log/wtmp

  • 内容:所有成功登录的历史记录

  • 格式:二进制,只能用 last 等命令读取

  • 轮转:通常会自动轮转(wtmp.1, wtmp.2.gz等)

2. btmp 文件

  • 路径:/var/log/btmp

  • 内容:所有失败的登录尝试

  • 查看命令:lastb 或 last -f /var/log/btmp

3. utmp 文件

  • 路径:/var/run/utmp

  • 内容:当前登录的用户信息

  • 查看命令:whow

实用技巧和组合命令

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"

与其他命令对比

 
命令数据源时间范围主要用途
last wtmp/btmp 历史记录 查看登录历史
who utmp 当前会话 查看当前登录用户
w utmp + /proc 当前会话 查看用户及活动
lastlog lastlog 所有用户 查看用户最后登录时间
lastb btmp 历史记录 查看失败登录

注意事项和常见问题

1. 权限要求

  • 查看 /var/log/wtmp:所有用户可读

  • 查看 /var/log/btmp:需要root权限

  • 某些选项可能需要特定权限

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 命令是系统管理员进行安全审计、故障排查和用户监控的重要工具。配合其他命令如 grepawksort 等,可以完成复杂的日志分析任务。

posted @ 2026-01-15 16:39  一生爱你  阅读(0)  评论(0)    收藏  举报