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