前言

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