web-dev-qa-db-ja.com

接続されているすべてのSSHセッションをリストしますか?

ルートにSSH接続し、同じマシンのルートに再度SSH接続しました。したがって、2つのウィンドウを開いて、リモートマシンのルートにSSHで接続します。

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

201
themirror

whoまたはw;追加情報については、who -a

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

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

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

ログには、セッションがいつ開いたり閉じたりしたか、セッションが誰に属しているか、ユーザーがどこから接続しているかなどが表示されます。ただし、これを単純な人間が読めるイベントのログからイベントに取得したい場合は、lotの解析を行う必要があります。ログには実際にどのセッションがまだアクティブであるかを判断するのに十分な情報が含まれていないため、解析が完了しても、おそらく正確なリストにはならない可能性があります。これらのログを使用することで得られる唯一の利点は、情報が他の方法のような中古のソースを介するのではなく、SSHDから直接得られることです。

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

207
jayhendren

次のコマンドを使用して、すべてのセッション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

O多分これは役に立つかもしれません:

[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:
119
sebelk

あなたも使うことができます

ps ax | grep sshd
14
Joel Inglao

@sebelkの答えを拡張する:

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

別の解決策は、netstatssの代わりに使用することです。たとえば(ルートが不要になったことに注意してください):

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
8
A.Meijer

簡単な参照のために追加されました。

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

[user1@Host ~]$ echo $SSH_CONNECTION

それは戻るはずです:あなたのIPとポートとあなたの接続先とポートのIP

192.168.0.13 50473 192.168.0.22 22

ttyまたはwhow)を使用して情報を取得することもできます:(編集:別の投稿で上記のリストになっているようです)

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

使用できます

last | head

私は何年も.loginスクリプトでこれを使用して、最近システムにログインしたユーザーを確認しました。ログインを使用してシステム上に誰かがいるかどうかを確認するのは、セキュリティが不十分なデバイスでした。

2
J.O. Williams

上記のコマンドのほとんどすべてを実行しました。sshを介して現在ログインしているユーザーを見つける最善の方法は次のとおりです。

last | grep "still logged in"

そして

who -a
0