whoコマンド

whoは現在ログイン中のユーザーを表示するコマンド。/var/run/utmpに記録された現在のセッションを読み取る。

$ who
alice    pts/0        Aug 11 11:09 (192.168.10.21)
bob      pts/1        Aug 11 11:09 (192.168.10.35)

左から、ユーザー名、端末名、ログイン時刻、接続元である。pts/0はSSHなどの擬似端末を表す。コンソールからのログインはtty1のように表示され、接続元の欄は空になる。

列見出しを表示する(-H)

-H(--heading)を付けると列見出しが出る。列の意味を確認したい場合に使う。

$ who -H
NAME     LINE         TIME         COMMENT
alice    pts/0        Aug 11 11:09 (192.168.10.21)
bob      pts/1        Aug 11 11:09 (192.168.10.35)

アイドル時間とPIDを表示する(-u)

-u(--users)はアイドル時間とプロセスIDを追加する。

$ who -H -u
NAME     LINE         TIME         IDLE          PID COMMENT
alice    pts/0        Aug 11 11:09 00:01         266 (192.168.10.21)
bob      pts/1        Aug 11 11:09 00:01         287 (192.168.10.35)

IDLE欄は端末が操作されていない時間を表す。直近1分以内に操作があった場合は.、24時間より長く放置されている場合はoldと表示される。放置されたSSHセッションを見つける場合に使う。

PID欄はutmpに記録されたログインプロセスのIDである。SSHでの接続ではsshdのセッションプロセスを指す。放置されたセッションを強制的に切断する場合、このPIDをkillする。

$ sudo kill 266

ログイン中の人数を数える(-q)

-q(--count)はユーザー名の一覧と人数だけを表示する。

$ who -q
alice bob
# users=2

同じユーザーが複数のセッションを開いている場合、その数だけ名前が並ぶ。

システムの起動時刻を表示する(-b)

-b(--boot)はシステムの起動時刻を表示する。

$ who -b
         system boot  Jul 25 05:51

現在のランレベルは-r(--runlevel)で表示する。

$ who -r
         run-level 5  Jul 25 05:51

すべての情報を表示する(-a)

-a(--all)は起動時刻、ランレベル、ログインプロセス、終了したプロセスまで含めて表示する。

$ who -a
           system boot  Jul 25 05:51
           run-level 5  Jul 25 05:51
LOGIN      tty1         Jul 25 05:52               712 id=tty1
alice    + pts/0        Aug 11 11:09 00:01         266 (192.168.10.21)
           pts/2        Aug 11 11:09               374 id=ts/2  term=0 exit=0

LOGINの行はログイン待ちの端末である。最終行は終了したセッションの記録で、-d(--dead)だけでも表示できる。

ユーザー名の右にある+は、writewallによるメッセージを受け取れる状態を示す。-は拒否、?は不明である。この表示だけを追加するには-Tを使う。

自分のセッションを確認する

who am iは自分自身のセッションだけを表示する。-mも同じ動作をする。

$ who am i
alice    pts/0        Aug 11 11:09 (192.168.10.21)

引数のam iに意味は無く、標準入力に紐づく端末の情報を表示する指定として扱われる。who mom likesのような2つの引数でも同じ結果になる。

whoamiとの違い

whoamiは現在の実効ユーザー名を表示するコマンドである。who am iとは結果が異なる場合もある。

$ sudo whoami
root
$ sudo who am i
alice    pts/0        Aug 11 11:09 (192.168.10.21)

whoamiid -unと同じく今の権限を表す。who am iは端末にログインしたユーザーを表すため、sudosuで権限を切り替えても元のユーザー名のままである。誰が作業しているかを調べる場合はwho am iが役立つ。

過去のログイン履歴を読む

引数にファイルを渡すと、そのファイルを読んで表示する。/var/log/wtmpを指定すると過去のログイン記録を確認できる。

$ who /var/log/wtmp

ただし履歴の確認にはlastのほうが適している。lastはログアウト時刻や接続時間も表示する。

wやlastとの使い分け

コマンド分かること
whoログイン中のユーザー、端末、接続元、ログイン時刻
wログイン中のユーザーに加えて、実行中のコマンドとCPU時間
last過去のログインとログアウトの履歴

誰がいるかだけを知りたい場合はwho、何をしているかまで知りたい場合はwを使う。

参考