私は先ほど SSH で root に接続し、同じマシンの root にもう一度 SSH で接続しました。そのため、リモート マシンの root に SSH 接続した 2 つのウィンドウが開いています。
シェルから、これら 2 つのセッションのリストを表示するにはどうすればよいでしょうか?
答え1
who
または、追加情報についてはw
;を参照してください。who -a
これらのコマンドは、ターミナルデバイス上のすべてのログインセッションを表示するだけです。列pts
に示されているように、SSHセッションは擬似ターミナルスレーブ( )上にあります。ただし、すべてのpts接続がSSHセッションであるわけではありません。たとえば、や などTTY
の擬似ターミナルデバイスを作成するプログラムはとして表示されます。xterm
screen
pts
pts と tty の違い列にあるさまざまな値のより詳しい説明については、こちらをTTY
参照してください。さらに、SFTP セッションはシェル ログイン セッションではないため、この方法では SFTP セッションにログインしているユーザーは表示されません。
すべての SSH セッションを明示的に表示する方法は知りません。この情報は、、、などのツールを使用してutmp
/からログイン情報を読み取ることで推測できます。または、@sebelk が回答で説明しているようなネットワーク ツールを使用して、ポート 22 (または SSH デーモンがリッスンしている場所) で開いている TCP 接続を見つけることで推測できます。wtmp
last
w
who
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/)。
別の解決策としては、 の代わりとなる を使用しますnetstat
。ss
たとえば、(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)