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