last command: システムのログイン履歴の表示

Linux command 3/N

公開日: 2022-08-09
更新日: 2024-02-27

  Table of Contents

lastコマンド

Def: lastコマンド

lastコマンドは/var/log/wtmpファイルを参照しシステムのログイン履歴を一覧表示するコマンド.

1
% last [オプション] [ユーザー名] [端末番号]

デフォルトの表示項目は

  • ユーザー名
  • 端末
  • ホスト(ローカルの場合はdisplay number)
  • ログイン日時
  • ログアウト日時(ログアウトしていない場合はstill logged in)

ユーザーをkirbyだけに絞って最新10件のみ表示する場合

1
2
3
4
5
6
7
8
9
10
11
% last -n 10 kirby
kirby pts/0        tmux(156948).%0  Tue Feb 21 01:04 - 01:15  (00:11)
kirby pts/0        tmux(154821).%0  Tue Feb 21 00:59 - 00:59  (00:00)
kirby :1           :1               Mon Feb 20 09:23   still logged in
kirby :1           :1               Thu Feb 16 09:24 - down   (09:28)
kirby :1           :1               Wed Feb 15 09:28 - down   (17:09)
kirby :1           :1               Tue Feb 14 22:18 - down   (05:43)
kirby :1           :1               Tue Feb 14 19:38 - down   (00:49)
kirby :1           :1               Tue Feb 14 09:24 - down   (08:59)
kirby :1           :1               Mon Feb 13 10:34 - down   (07:58)
kirby :1           :1               Fri Feb 10 09:27 - down   (1+01:37)

最後の行の1+01:37は1 days + 01:37, つまり, 25:37時間稼働したことを意味します.

主要オプション

short option long option 説明
-n <num> --limit lastで表示する行数を数値で指定する
-t YYYYMMDDhhmmss --until 指定した日時より前のログイン情報を表示する
-s YYYYMMDDhhmmss --since 指定した日時より後のログイン情報を表示する
-w   ユーザー名を省略しない

特定の期間でのlogin履歴を確認したい場合は,

1
2
3
4
5
% last -s yesterday -t today     
kirby    :1           :1               Mon Feb 26 09:23   still logged in
reboot   system boot  6.5.0-18-generic Mon Feb 26 09:22   still running

wtmp begins Sun Jul 16 03:07:46 2023

last vs lastlog

各ユーザーの最新ログインのみに関心がある場合はlastlogコマンドを用いることも有力な選択肢です.

Def: lastlog

  • /var/log/lastlogバイナリファイルを参照して最新のログイン情報(ログイン名, ポート,最終ログイン日時)をユーザーごとに表示するコマンド
  • 一度もログインしていないユーザーについては**Never logged in**と表示

Ubuntuサーバーにてlastlogコマンドを実行してみると

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
kirby@hostname $ lastlog
Username         Port     From             Latest
root                                       **Never logged in**
daemon                                     **Never logged in**
bin                                        **Never logged in**
sys                                        **Never logged in**
sync                                       **Never logged in**
...
sssd                                       **Never logged in**
speech-dispatcher                           **Never logged in**
fwupd-refresh                              **Never logged in**
nm-openvpn                                 **Never logged in**
saned                                      **Never logged in**
pulse                                      **Never logged in**
gnome-initial-setup                           **Never logged in**
hplip                                      **Never logged in**
gdm                                        Wed Feb 21 16:46:04 +0900 2022
dedede                                     Wed Feb 21 16:46:08 +0900 2022
pomuipomupurin                             **Never logged in**
korokorokirby                              **Never logged in**
nvidia-persistenced                           **Never logged in**
donkey                                     Tue Dec 13 12:35:19 +0900 2022
naruto           pts/4    123.354.234.71   Thu Feb 15 17:30:35 +0900 2022
sasuke           pts/3    123.358.234.94   Tue Jan 24 17:28:13 +0900 2022
kirby            pts/0    123.352.234.5    Mon Feb 20 22:43:29 +0900 2022
rstudio-server                             **Never logged in**

ここで, **Never logged in**と表記されるユーザーがたくさんいることに気づきます.

  • Login via gdm is not logged
  • serviceやsystemと紐づくuserは基本loginはしない

が理由となります.

その他のログイン状況を参照するコマンド

ログイン状況を表示するコマンドとして他にも以下のようなコマンドがあります

  • whoコマンド: ログイン中のユーザーとログイン時刻とIPアドレスを表示するコマンド
  • wコマンド: ログインしているユーザーとユーザーが実行中のプロセスを表示するコマンド
  • lastbコマンド: 失敗したログインの記録を表示するコマンド
  • lastlog: 最新のログインをユーザーごとに表示するコマンド

whoコマンド

1
2
3
kirby@hostname:~$ who
dedede  :1           2022-02-04 17:45 (:1)
kirby   pts/0        2022-02-26 22:43 (123.456.789.5)

whoコマンドは, /var/run/utmpの情報に基づいて, 端末とlogin時刻を表示することができます. 上の例ではユーザーdededeは端末:1を利用して 2022-02-04 17:45 にloginしていると解釈できます.

:1はUbuntuの文脈ではdisplay serverの番号を表しており, :1は特に2つ目のdisplay serverを意味しています. X Window SystemベースのGUIでloginしているときは基本的には「display serverの番号」が表示されます.

一方, Waylandベースでログインした場合は

1
2
dedede@hostname:~$ who
dedede   tty2        2022-02-26 22:43 (tty2)

と僕の環境では表示されます.

REMARKS

  • who reports the logged in user from the console but none from the GUI.

whoコマンドのオプション

whoコマンドのオプションの代表例は以下です

short option long option 説明
-a --all 全ての情報を表示する
-b --boot 現在ログインしているシステムが起動した時刻を表示
-m   標準入力に関連付けられたホスト名とユーザーのみを表示, who am iと同じ
-q --count ログイン中のユーザーのログイン名とユーザー数を表示
-r --runlevel 現在のランレベルを表示

GUIで起動したUbuntu上でtmuxを起動し, whoコマンドの挙動を見てみます

1
2
3
% who
kirby_ubuntu :1           2022-02-26 09:23 (:1)
kirby_ubuntu pts/0        2022-02-27 01:04 (tmux(1w [オプション] [ユーザー名]56948).%0)

このとき, who -mで自分の情報だけを表示すると

1
2
3
4
5
6
7
8
% who am i
kirby_ubuntu pts/0        2022-02-27 01:04 (tmux(156948).%0)

% who aa bb
kirby_ubuntu pts/0        2022-02-27 01:04 (tmux(156948).%0)

% whoami
kirby_ubuntu

なお, who aa bbでもwho am iと同じ挙動になる理由は任意の2つの引数を指定するとwho -mとして動作するためです.

wコマンド: ログインしているユーザーと実行中のプロセスを表示

Def: wコマンド

  • ログインしているユーザーと実行中のプロセスを表示するコマンド
  • /var/run/utmpの情報に基づいて出力
1
w [オプション] [ユーザー名]

whoコマンドと異なり, ヘッダーにて左から

  • 現在の時刻
  • システムの稼働時間
  • 現在ログインしているユーザーの数
  • システムの平均負荷(過去1分間, 5分間, 15分間)

を出力します.

ユーザーごとの情報は, 左から

  • USER: 現在ログインしているユーザーのログイン名
  • TTY: 端末
  • FROM: リモートホスト
  • LOGIN@: ログイン時刻
  • IDLE: アイドル時間
  • JCPU: その端末で実行した全プロセスが使った時間
  • PCPU: カレントプロセスが使用した時間
  • WHAT: 現在実行中のプロセス

を表示します.w [オプション] [ユーザー名]

lastbコマンド: Bad Login履歴を確認する

Def: lastbコマンド

  • /var/log/btmpファイルを参照しシステムのログインエラー履歴を一覧表示するコマンド
  • 実行にはroot権限が必要
1
% lastb [オプション] [ユーザー名] [端末番号]

Optionはlastコマンドとほぼ同じで

short option long option 説明
-n <num> --limit lastで表示する行数を数値で指定する
-t YYYYMMDDhhmmss --until 指定した日時より前のログイン情報を表示する
-s YYYYMMDDhhmmss --since 指定した日時より後のログイン情報を表示する
-w   ユーザー名を省略しない

Appendix: システム上のユーザー一覧を取得する

Linuxでは大まかに2種類のユーザーが存在します

  • 人間が操作するためのアカウントとして作られたuser
  • 特定のserviceやsystem functionと結びつく形で作られたuser

これらの情報は/etc/passwdに保存されています. そのため, ユーザー一覧を取得したい場合は 以下のコマンドを入力します:

1
% cut -d : -f 1 /etc/passwd
-d 区切り文字を指定
-f 切り出すフィールドindexを指定, 複数の場合は1-3などと指定

または, getentコマンドを用いて

1
% getent passwd | cut -d : -f1

References



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)