Linux - last 命令


前言

  • 為啥寫這篇?因為聽 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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM