ルートにSSH接続し、同じマシンのルートに再度SSH接続しました。したがって、2つのウィンドウを開いて、リモートマシンのルートにSSHで接続します。
シェルから、これらの2つのセッションのリストを表示するにはどうすればよいですか?
who
またはw
;追加情報については、who -a
。
これらのコマンドは、端末デバイス上のすべてのログインセッションを表示するだけです。 pts
列に示されているように、SSHセッションは疑似端末スレーブ(TTY
)上にありますが、すべてのpts接続がSSHセッションであるとは限りません。たとえば、xterm
やscreen
などの疑似端末デバイスを作成するプログラムは、pts
と表示されます。 TTY
列にあるさまざまな値の詳細については、 ptsとttyの違い を参照してください。さらに、SFTPセッションはシェルログインセッションではないため、このアプローチではSFTPセッションにログインしているユーザーは表示されません。
すべてのSSHセッションを明示的に表示する方法がわかりません。この情報は、utmp
、wtmp
、または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
を使用することをお勧めします。ほとんどの場合、これにより必要な情報が得られます。
次のコマンドを使用して、すべてのセッション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:
あなたも使うことができます
ps ax | grep sshd
@sebelkの答えを拡張する:
netstat
を使用するソリューションは良いものですが、root権限が必要です。加えて net-tools
パッケージ(netstat
を提供)は、一部の新しいLinuxディストリビューションで非推奨になりました( https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and -their-replacements / )。
別の解決策は、netstat
、ss
の代わりに使用することです。たとえば(ルートが不要になったことに注意してください):
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
簡単な参照のために追加されました。
疑似シェル(例:/ 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)
使用できます
last | head
私は何年も.loginスクリプトでこれを使用して、最近システムにログインしたユーザーを確認しました。ログインを使用してシステム上に誰かがいるかどうかを確認するのは、セキュリティが不十分なデバイスでした。
上記のコマンドのほとんどすべてを実行しました。sshを介して現在ログインしているユーザーを見つける最善の方法は次のとおりです。
last | grep "still logged in"
そして
who -a