接続されているすべてのSSHセッションを一覧表示する方法
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番目の列には、ユーザーの接続方法が表示されます。 この例では、user2とuser3は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コマンド
これまで、ログインしたユーザーを表示するいくつかの方法を見てきました。
$ 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を使用して結果をフィルタリングしてみましょう。 出力から、user1とuser2がSSH経由で接続されていることがわかります。
ログインしているユーザーを一覧表示するコマンドを使用するだけでは不十分なシナリオでは、 netstat を使用すると、アクティブなSSHセッションのより正確な画像が得られます。
6. ssコマンド
SSH接続を見つけるためのもう1つの便利なユーティリティは、ssコマンドです。 これは、ソケットを調査するために使用されるツールです。
sshのssの出力を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コマンドで実行中のプロセスを確認することでも見つけることができます。
psとgrepの出力を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接続を提供する子プロセスが表示されます。 それらを見ると、user1とuser2が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セッションを一覧表示する方法について説明しました。 それらを見つけるために使用できるいくつかの方法について説明しました。 さらに、私たちは彼らの長所と短所を調べました。