whoコマンドを用いると誰がログインしているかを調べることができます。whoコマンドが基にしている情報は/var/run/utmpの情報になります。このutmpデータベースの情報は誰がシステムを利用しているかの情報になります。
目次
- 1 誰がログインしているかを確認(オプションなし)
- 2 whoコマンドの全ての表示をオン(-aオプション)
- 3 システムの起動時間を表示(-bオプション)
- 4 終了したプロセスを表示(-dオプション)
- 5 ヘッダー情報を表示(-Hオプション)
- 6 ログイン画面の端末を表示(-lオプション)
- 7 現在の標準入力をしている端末のユーザとホスト名を表示(-mオプション)(who am i)
- 8 現在のログイン中のユーザ名とユーザ数を表示(-qオプション)
- 9 現在のランレベルを表示(-rオプション)
- 10 端末のメッセージステータスを表示(-Tオプション)
- 11 ログイン中のユーザのリストを表示(-uオプション)
- 12 その他のオプション
- 13 参考
誰がログインしているかを確認(オプションなし)
whoコマンドはログインしているユーザを調べることができます。whoコマンドをオプションなしで使用したときに表示される情報はユーザ名、端末情報、ログインしたときの時間、リモートホストの名前になります。
1 2 3 |
$ who sshtest tty1 2021-02-01 11:49 s2user1 pts/0 2021-02-01 11:43 (stepserver) |
また、utmpdumpコマンドを用いると/var/run/utmpの情報を確認できます。
1 2 3 4 5 6 7 |
$ utmpdump /var/run/utmp Utmp dump of /var/run/utmp [2] [00000] [~~ ] [reboot ] [~ ] [4.15.0-123-generic ] [0.0.0.0 ] [2021-02-01T11:42:39,065955+0000] [1] [00053] [~~ ] [runlevel] [~ ] [4.15.0-123-generic ] [0.0.0.0 ] [2021-02-01T11:43:00,078688+0000] [7] [01267] [tty1] [sshtest ] [tty1 ] [ ] [0.0.0.0 ] [2021-02-01T11:49:22,252197+0000] [7] [01157] [ts/0] [s2user1 ] [pts/0 ] [stepserver ] [192.168.0.101 ] [2021-02-01T11:43:30,173908+0000] [8] [01217] [ts/1] [ ] [pts/1 ] [ ] [192.168.0.101 ] [2021-02-01T11:45:51,153588+0000] |
whoコマンドの全ての表示をオン(-aオプション)
-aオプションは、-b・-d・-l・-p・-r・-t・-T・-uのオプションと同様の機能になります。whoコマンドで確認できるすべての情報を表示します。
1 2 3 4 5 6 |
$ who -a system boot 2021-02-04 10:36 run-level 5 2021-02-04 10:36 sshtest - tty1 2021-02-04 11:58 . 1721 sshtest + pts/0 2021-02-04 10:37 . 1145 (stepserver) s2user1 + pts/1 2021-02-04 10:54 00:49 1414 (stepserver) |
ヘッダー情報がほしい場合は-Hオプションを加えます。
1 2 3 4 5 6 7 |
$ who -aH NAME LINE TIME IDLE PID COMMENT EXIT system boot 2021-02-04 10:36 run-level 5 2021-02-04 10:36 sshtest - tty1 2021-02-04 11:58 00:01 1721 sshtest + pts/0 2021-02-04 10:37 . 1145 (stepserver) s2user1 + pts/1 2021-02-04 10:54 00:50 1414 (stepserver) |
システムの起動時間を表示(-bオプション)
-bオプションを用いるとシステムの起動時間を表示できます。
1 2 |
$ who -b system boot 2021-02-01 07:45 |
終了したプロセスを表示(-dオプション)
-dオプションを用いると終了したプロセスを表示できます。
1 2 |
$ who -d pts/1 2021-02-01 11:45 1217 id=ts/1 term=0 exit=0 |
これはutmpデータベースでDEAD_PROCESSに該当するレコードになります。
1 2 3 |
$ utmpdump /var/run/utmp |grep '\[8\]' Utmp dump of /var/run/utmp [8] [01217] [ts/1] [ ] [pts/1 ] [ ] [192.168.0.101 ] [2021-02-01T11:45:51,153588+0000] |
utmpについては以下のコマンドで確認できます。
1 |
man 5 utmp |
ヘッダー情報を表示(-Hオプション)
-Hオプションを用いるとヘッダー情報を表示します。
1 2 3 |
$ who -H NAME LINE TIME COMMENT s1user1 pts/0 2021-02-01 08:12 (10.0.2.7) |
ログイン画面の端末を表示(-lオプション)
-lオプションを用いるとログイン画面の端末を表示できます。
1 2 |
$ who -l LOGIN tty2 2021-02-01 11:57 1284 id=tty2 |
これはutmpデータベースでLOGIN_PROCESSに該当するレコードになります。
1 2 3 |
$ utmpdump /var/run/utmp |grep '\[6\]' Utmp dump of /var/run/utmp [6] [01284] [tty2] [LOGIN ] [tty2 ] [ ] [0.0.0.0 ] [2021-02-01T11:57:32,170764+0000] |
現在の標準入力をしている端末のユーザとホスト名を表示(-mオプション)(who am i)
-mオプションを用いると現在の標準入力をしている端末のユーザとホスト名を表示します。
1 2 |
$ who -m s2user1 pts/0 2021-02-01 11:43 (stepserver) |
引数にamとiを入力することで-mオプションと同様の機能になります。
1 2 |
$ who am i s2user1 pts/0 2021-02-01 11:43 (stepserver) |
また、whoamiコマンドもあるので注意しましょう。これは'id -un'と同様で自分のユーザ名を表示するコマンドになります。
1 2 |
$ whoami s2user1 |
現在のログイン中のユーザ名とユーザ数を表示(-qオプション)
-qオプションを用いると現在ログイン中のユーザ名とユーザ数を表示します。
1 2 3 |
$ who -q sshtest s2user1 s2user1 # users=3 |
現在のランレベルを表示(-rオプション)
-rオプションは現在のランレベルを表示します。
1 2 |
$ who -r run-level 5 2021-02-04 10:36 |
ランレベルについては以下のコマンドで確認できます。
1 |
man 8 runlevel |
また、initシステムとしてsystemdをweb検索で調べても良いかもしれません。
端末のメッセージステータスを表示(-Tオプション)
-Tオプションを用いると淡滅のメッセージステータスをユーザ名の横の('+','-','?')の記号で表示します。'+'はwriteコマンドでメッセージを書き込め、'-'は書き込めません。'?'は端末デバイスを見つけられないになります。
1 2 3 4 |
$ who -T sshtest - tty1 2021-02-01 11:49 s2user1 + pts/0 2021-02-01 11:43 (stepserver) s2user1 + pts/1 2021-02-01 12:16 (stepserver) |
wallコマンドやwriteコマンドでメッセージを送ることができるステータス。wallコマンドは全てのユーザにメッセージを送るコマンドで、writeコマンドはユーザを指定してメッセージを送るコマンドになります。
例えば、writeコマンドを実行し、メッセージを入力してEnterキーを押すことでメッセージを送信できます。メッセージの送信を終了する場合はCtrl+D又はCtrl+Cを入力します。以下はwriteコマンドでメッセージを送信する例になります。
送信側(sshtestの端末)
1 2 3 4 5 |
$ who -T sshtest + pts/0 2021-02-04 10:37 (stepserver) s2user1 + pts/1 2021-02-04 10:54 (stepserver) $ write s2user1 test message |
受信側(s2user1の端末)
1 2 3 4 |
$ Message from sshtest@sshtest on pts/0 at 10:56 ... test message EOF |
双方向でメッセージをやり取りする場合は受信側でもwriteコマンドを実行すること(相手からのメッセージが端末に表示されて気になるかもしれませんが気にせずにコマンドを入力して実行すること)で双方向でメッセージを送ることができます。
ログイン中のユーザのリストを表示(-uオプション)
デフォルトの表示より詳しいリストを表示します。
1 2 3 4 5 |
$ who -Hu NAME LINE TIME IDLE PID COMMENT sshtest tty1 2021-02-01 11:49 00:03 1267 s2user1 pts/0 2021-02-01 11:43 . 1157 (stepserver) s2user1 pts/1 2021-02-01 12:16 00:02 1871 (stepserver) |
その他のオプション
-sオプションはデフォルトのオプションで、ユーザ名、端末情報、ログインしたときの時間、リモートホストの名前のみを表示します。
--lookupオプションはIPアドレスのホスト名の名前解決を行います。
また、-pオプションと-tオプションについては具体的にどういう状況であれば使用できるかが説明できませんが、ソースコードを見ると、-pオプションはutmpデータベースでINIT_PROCESSに該当するユーザを表示し、-tオプションはutmpデータベースでNEW_TIMEに該当するユーザを表示します。
utmpについては以下のコマンドで確認できます。
1 |
man 5 utmp |