1. 概要

SSHは、リモートコンピューターに接続できるようにするネットワークプロトコルです。 Linuxサーバーを管理する場合、SSH経由で接続しているユーザーを確認する必要がある場合があります。 このチュートリアルでは、アクティブなSSHセッションを一覧表示する方法を見ていきます。 いくつかの可能な方法を検討し、それらの長所と短所を明らかにします。

2. whoコマンド

ログインしているユーザーのリストを表示するには、whoコマンドを使用して始めましょう。

$ who
user1     tty1         2020-08-29 14:59
user2     pts/0        2020-08-29 14:57 (203.0.113.24)
user3     pts/1        2020-08-29 15:02 (203.0.113.13)

出力の最初の列には、現在ログインしているユーザーのリストが表示されます。 2番目の列には、ユーザーの接続方法が表示されます。 この例では、user2user3はSSHを使用して接続されていますが、user1はサーバーに直接接続されています。

SSHセッションは疑似端末スレーブ(pts)で行われます。 ただし、すべてのpts接続が必ずしもSSH接続であるとは限らないことに注意してください。 たとえば、screenコマンドも疑似端末スレーブを作成します。

さらに、 who コマンドはSFTP接続を表示しません。これは、SFTP接続がシェルログインセッションではないためです。

3. wコマンド

who コマンドと同様に、wコマンドを使用できます。 ログインしているユーザーを表示するだけでなく、ユーザーが行っていることも表示します。

$ w
 16:21:34 up  1:29,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user1    tty1     -                14:59   16.00s  0.05s  0.01s -bash
user2    pts/0    203.0.113.24     14:57    5.00s  0.04s  0.02s vim
user3    pts/1    203.0.113.13     15:02    1.00s  0.02s  0.00s w

w コマンドには、whoコマンドと同じ欠点があることに注意してください。 まず、ログインしているすべてのユーザーがSSH経由で接続しているとは限りません。これを判断するには、TTY列を調べる必要があります。

以前は、SSHセッションが疑似端末スレーブ( pts )上にあることを確立しました。 ここでも、すべてのptsセッションがSSH接続であるとは限らないことに注意する必要があります。

ほとんどの場合、wおよびwhoコマンドは、SSHセッションの概要を取得するための最も簡単な方法です。 通常、ログインしているユーザーはSSH経由で接続されます。

4. lastコマンド

whoおよびwコマンドに加えて、lastコマンドはログインしたユーザーを見つける別の方法です。 最後にログインしたユーザーのリストが表示されます。 現在ログインしているユーザーのみに関心があるため、 grep を使用して、 last:の出力をフィルタリングしてみましょう。

$ last | grep 'still logged in'
root     pts/1        203.0.113.13   Sat Aug 29 15:02   still logged in
root     tty1                        Sat Aug 29 14:59   still logged in
root     pts/0        203.0.113.24   Sat Aug 29 14:57   still logged in

last コマンドは、SSH接続を明示的に表示しません。 代わりに、ログインしているユーザーが表示されます。 出力の2番目の列を見て、ユーザーがどのように接続しているかを判断する必要があります。 SSHセッションは、疑似端末スレーブ( pts )で行われます。 ただし、すべてのpts接続が必ずしもSSH接続であるとは限らないことも考慮する必要があります。

5. netstatコマンド

これまで、ログインしたユーザーを表示するいくつかの方法を見てきました。 SSHセッションは、ネットワーク接続を調べることでも見つけることができます。 そのために、 netstat

$ netstat -atnp | grep 'ESTABLISHED.*sshd'
tcp        0      0 198.51.100.14:22        203.0.113.13:49570    ESTABLISHED 1674/sshd: user1@pts 
tcp        0     36 198.51.100.14:22        203.0.113.24:57586    ESTABLISHED 1894/sshd: user2@pts 

netstat は、必要以上の情報を表示します。 したがって、確立されたSSH接続に焦点を当てるために、grepを使用して結果をフィルタリングしてみましょう。 出力から、user1user2がSSH経由で接続されていることがわかります。

ログインしているユーザーを一覧表示するコマンドを使用するだけでは不十分なシナリオでは、 netstat を使用すると、アクティブなSSHセッションのより正確な画像が得られます。

6. ssコマンド

SSH接続を見つけるためのもう1つの便利なユーティリティは、ssコマンドです。 これは、ソケットを調査するために使用されるツールです。

sshssの出力をgreppingしてアクティブなSSH接続を見つけましょう。

$ ss | grep ssh
tcp   ESTAB  0      0                    198.51.100.14:ssh       203.0.113.13:49570                                                                           
tcp   ESTAB  0      36                   198.51.100.14:ssh       203.0.113.24:57586 

ss を使用する際に考慮すべき点は、 netstat の場合のように、接続の背後にユーザー名が表示されないことです。

7. psコマンド

アクティブなSSHセッションは、psコマンドで実行中のプロセスを確認することでも見つけることができます。

psgrepの出力をsshd:に使用してみましょう。

$ ps axfj | grep sshd
      1     776     776     776 ?             -1 Ss       0   0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
    776   15457   15457   15457 ?             -1 Ss       0   0:00  \_ sshd: user1@pts/0
  15558   15681   15680   15558 pts/0      15680 S+       0   0:00  |       \_ grep --color=auto sshd
    776   15596   15596   15596 ?             -1 Ss       0   0:00  \_ sshd: user2@pts/1

最初の行は、新しいSSH接続をリッスンしているマスターサーバーです。 その下に、それぞれ単一のSSH接続を提供する子プロセスが表示されます。 それらを見ると、user1user2がSSH経由で接続されていることがわかります。

ログインしているユーザーの一覧表示が不十分な場合、 ps を使用すると、アクティブなSSHセッションのより正確な概要を確認できます。

8. SSHデーモンログ

ログファイルはSSH関連情報のもう1つのソースです。ログファイルの場所は、使用しているLinuxディストリビューションによって異なります。 たとえば、Ubuntuでは、SSH関連のログは/var/log/auth.log.にあります。

ログを調べて、user1がSSH経由で接続するとどうなるか見てみましょう。

Aug 30 08:43:36 my-ssh-server sshd[16469]: pam_unix(sshd:session): session opened for user user1 by (uid=1)

user1の新しいセッションが作成されます。 user1 がログアウトすると、セッションは閉じられます。

Aug 30 08:49:02 my-ssh-server sshd[16469]: pam_unix(sshd:session): session closed for user user1

ログは、履歴情報の優れた情報源です。 ただし、現在アクティブなSSHセッションをすばやく見つけるには便利ではありません。

9. 結論

このチュートリアルでは、接続されているSSHセッションを一覧表示する方法について説明しました。 それらを見つけるために使用できるいくつかの方法について説明しました。 さらに、私たちは彼らの長所と短所を調べました。