接続されているすべての SSH セッションを一覧表示しますか?

接続されているすべての SSH セッションを一覧表示しますか?

私は先ほど SSH で root に接続し、同じマシンの root にもう一度 SSH で接続しました。そのため、リモート マシンの root に SSH 接続した 2 つのウィンドウが開いています。

シェルから、これら 2 つのセッションのリストを表示するにはどうすればよいでしょうか?

答え1

whoまたは、追加情報についてはw;を参照してください。who -a

これらのコマンドは、ターミナルデバイス上のすべてのログインセッションを表示するだけです。列ptsに示されているように、SSHセッションは擬似ターミナルスレーブ( )上にあります。ただし、すべてのpts接続がSSHセッションであるわけではありません。たとえば、や などTTYの擬似ターミナルデバイスを作成するプログラムはとして表示されます。xtermscreenptspts と tty の違い列にあるさまざまな値のより詳しい説明については、こちらをTTY参照してください。さらに、SFTP セッションはシェル ログイン セッションではないため、この方法では SFTP セッションにログインしているユーザーは表示されません。

すべての SSH セッションを明示的に表示する方法は知りません。この情報は、、、などのツールを使用してutmp/からログイン情報を読み取ることで推測できます。または、@sebelk が回答で説明しているようなネットワーク ツールを使用して、ポート 22 (または SSH デーモンがリッスンしている場所) で開いている TCP 接続を見つけることで推測できます。wtmplastwwho

3 つ目の方法は、SSH デーモンからのログ出力を解析することです。OS ディストリビューション、SSH ディストリビューション、構成などに応じて、ログ出力はさまざまな場所にある可能性があります。RHEL 6 ボックスでは、ログは にありました/var/log/sshd.log。RHEL 7 ボックスと Arch Linux ボックスでは、journalctl -u sshdログを表示するために を使用する必要がありました。一部のシステムでは、SSH ログが syslog に出力されることがあります。ログはこれらの場所または他の場所にある可能性があります。表示されるログの例を次に示します。

[myhost ~]% grep hendrenj /var/log/sshd.log | grep session
May  1 15:57:11 myhost sshd[34427]: pam_unix(sshd:session): session opened for user hendrenj by (uid=0)
May  1 16:16:13 myhost sshd[34427]: pam_unix(sshd:session): session closed for user hendrenj
May  5 14:27:09 myhost sshd[43553]: pam_unix(sshd:session): session opened for user hendrenj by (uid=0)
May  5 18:23:41 myhost sshd[43553]: pam_unix(sshd:session): session closed for user hendrenj

ログには、セッションの開始と終了、セッションの所有者、ユーザーがどこから接続しているかなどが表示されます。ただし、多くこれを、人間が判読できる単純なイベント ログから現在アクティブなセッションのリストに取得する場合、解析に時間がかかります。また、ログにはどのセッションがまだアクティブであるかを判断するのに十分な情報が実際には含まれていないため、解析が終了しても正確なリストにはならない可能性があります。つまり、基本的には推測するだけです。これらのログを使用することで得られる唯一の利点は、他の方法のように二次的なソース経由ではなく、SSHD から直接情報を取得することです。

を使用することをお勧めしますw。ほとんどの場合、これで必要な情報が得られます。

答え2

次のコマンドですべてのセッション ssh を確認できます。

[root@router ~]# netstat -tnpa | grep 'ESTABLISHED.*sshd'
tcp        0      0 192.168.1.136:22            192.168.1.147:45852         ESTABLISHED 1341/sshd           
tcp        0      0 192.168.1.136:22            192.168.1.147:45858         ESTABLISHED 1360/sshd

あるいは、これが役に立つかもしれません:

[root@router ~]# ps auxwww | grep sshd:
root      1341  0.0  0.4  97940  3952 ?        Ss   20:31   0:00 sshd: root@pts/0 
root      1360  0.0  0.5  97940  4056 ?        Ss   20:32   0:00 sshd: root@pts/1 
root      1397  0.0  0.1 105300   888 pts/0    S+   20:37   0:00 grep sshd:



       

答え3

@sebelk の回答を拡張します:

を使用するソリューションnetstatは良いものですが、ルート権限が必要です。さらに、net-toolsパッケージ(を提供するnetstat)は、いくつかの新しいLinuxディストリビューションで非推奨になっています(https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/)。

別の解決策としては、 の代わりとなる を使用しますnetstatssたとえば、(root は不要であることに注意してください)。

user@router:~# ss | grep ssh
tcp    ESTAB      0      0      192.168.1.136:ssh                  192.168.1.147:37620                
tcp    ESTAB      0      0      192.168.1.136:ssh                  192.168.1.147:37628

答え4

簡単な参照用に追加しました。

疑似シェル (例: /dev/pts/0 ) を使用している場合、最も簡単な方法の 1 つは次のようになります。

[user1@host ~]$ echo $SSH_CONNECTION

返されるのは、IPとポート、接続先のIPとポートです。

192.168.0.13 50473 192.168.0.22 22

ttyまたはwho( )を使用して情報を取得することもできますw。(編集: 別の投稿で上にリストされていることがわかりました)

[user1@host ~]$ who
user1 tty1          2018-01-03 18:43
user2 pts/0        2018-01-03 18:44 (192.168.0.13)

関連情報