• Linux


    前言

    • 为啥写这篇?因为听 grep、sed 教程的时候有这个命令
    • 栗子
    • 加上工作中,运维给我排查问题的时候也用到了,感觉挺重要,先了解为敬!

    命令作用

    • 显示上次登录用户的列表
    • 这个是在 Linux 下的 last 命令,跟 Mac 下有点不同

    语法格式

    last [options] [<username>...] [<tty>...]

    参数说明

    参数 含义
    -<num> 显示多少行
    -a, --hostlast  last在最后一列中显示主机名
    -d, --dns 将IP号转换回主机名
    -f, --file <file> <读取特定文件而不是 /var/log/wtmp
    -F, --fulltimes  打印完整的登录和注销时间和日期 
    -i, --ip 以数字和点表示法显示ip编号
    -n, --limit <number> 限制要显示的行数
    -R, --nohostname 不显示hostname字段
    -s, --since <time> 显示指定时间以来的行
    -t, --until <time> 显示指定时间之前的行
    -p, --present <time> 显示在指定时间出现的人员
    -w, --fullnames 显示完整的用户名和域名
    -x, --system 显示系统关闭条目和运行级别更改
    -h, --help 帮助
    -V, --version 版本

    查看列表说明

    • 第一列:用户名
    • 第二列:终端位置,pts/0 (伪终端) 意味着从 SSH 或 telnet 的远程连接的用,.tty (teletypewriter) 意味着直接连接到计算机或者本地连接的用户
    • 第三列:登录的 IP 或终端名,用户通过本地终端连接则显示空,除了重启活动,内核版本会显示在状态中
    • 第四列:登录开始时间
    • 第五列:结束时间
    • 第六列:持续时间,still logged in 表示仍然在线

    显示5行,将 host 放在最后一列,打印完整的时间日期,并将 ip 转成主机名

    last -5 -a -d -F

    可以看到不加 -F,时间一列的区别 

    不显示 hostname

    last -R

    显示5行,显示完整的用户名和主机名,并只显示从 2021-06-04 17:33:00 开始到现在的信息

    last -5 -w -s 202106041733300

    显示5行,并只显示在 2021-06-06 00:00:00 之前的信息

    last -5 -t 20210606000000

    last 命令的数据源

    执行 last 命令时,默认读取  /var/log/wtmp  文件

    • 它是一个二进制文件,记录每个用户的登录系统次数和持续时间、注销、系统重启、停机等事件
    • 它是永久记录这些信息的,系统运行时间增加,文件也会越来越大
    • 因为它本身是一个二进制文件,所以无法直接 cat 查看,因此诞生了 last 命令来查看

    还有另外一个命令,lastb

    • 它是读取 /var/log/btmp 文件,记录登录系统失败的每个用户
    • 当然,用 last -f 读取这个文件也是一样效果的

     /var/run/utmp 

    • 它比较重要,记录着当前正在登录系统的每个用户
    • 它的数据结构和 /var/log/wtmp 的数据结构一样

     /var/log/lastlog 

    • 记录着每个用户最后登录系统的信息
    • 它的数据结构和 /var/run/utmp 、 /var/log/wtmp 不一样

    last -f /var/log/wtmp

    last -f /var/log/wtmp

    等价于只敲 last

    last -f /var/log/btmp

    last -f /var/log/btmp

    • 和 lastb 查出来用户列表信息是一样的
    • 本地用户直接 ssh 登阿里云
    • 因为阿里云没有 polo 这个用户,所以连不上
    • 然后系统就自动记录 polo 用户登录系统失败了

    last -f /var/run/utmp

    last -f /var/run/utmp 

    当前就一个 root 用户登录,加上一个系统信息

    last -f /var/log/lastlog

    last -f /var/log/lastlog

    直接用 last -f 好像并不会显示信息,应该是因为读取的文件的数据结构不一致的原因

    lastlog

    lastlog

    后面查了下,可以直接用 lastlog 查看  /var/log/lastlog 

    实际工作场景:因为某些用户的链接数太多导致无法再连接,此时需要断开用户已存在的终端链接

    通过 last 找到用户的终端信息,然后用 fuser kill 掉

    last
    fuser -k /dev/pts/0 

    • 这里就踩了个坑,如果直接敲 pts/0 会报错, 因为路径不对,需要加上根路径 /dev/pts/0 
    • 杀掉当前终端链接文件后,我的 ssh 连接就自动退掉了

    重新 ssh 连接服务器,查看之前的登录信息

    fuser 命令详解文章

     https://www.cnblogs.com/poloyy/p/14846179.html

    通过 fuser 批量杀掉同一个用户的终端链接

    fuser -k $(last -w | grep name | awk '{print "/dev/"$2}')

    自己换掉 name

    直接 ps -ef 去删掉

    ps -ef|grep name | awk '{print $2}' | xargs kill -9

      

  • 相关阅读:
    Python基础知识
    Oracle 总结
    Linux基本命令
    测试理论
    计算机基础
    http常见的状态码,400,401,403状态码分别代表什么?
    html
    day21 包
    day20 模块引入的一些说明
    我又回来了???
  • 原文地址:https://www.cnblogs.com/poloyy/p/14851710.html
Copyright © 2020-2023  润新知