Ich habe mich einfach per SSH mit dem Root-Zugriff verbunden und dann noch einmal per SSH mit dem Root-Zugriff auf derselben Maschine. Ich habe also zwei Fenster geöffnet, die beide per SSH mit dem Root-Zugriff auf meiner Remote-Maschine verbunden sind.
Wie kann ich in der Shell eine Liste dieser beiden Sitzungen anzeigen?
Antwort1
who
oder w
; who -a
für weitere Informationen.
Diese Befehle zeigen nur alle Anmeldesitzungen auf einem Terminalgerät an. Eine SSH-Sitzung wird auf einem Pseudoterminal-Slave ( pts
) stattfinden, wie in der TTY
Spalte angezeigt, aber nicht alle pts-Verbindungen sind SSH-Sitzungen. Beispielsweise werden Programme, die ein Pseudoterminalgerät wie xterm
oder erstellen screen
, als angezeigt pts
. SieheUnterschied zwischen pts und ttyfür eine bessere Beschreibung der verschiedenen Werte in der TTY
Spalte. Darüber hinaus zeigt dieser Ansatz niemanden an, der bei einer SFTP-Sitzung angemeldet ist, da SFTP-Sitzungen keine Shell-Anmeldesitzungen sind.
Ich kenne keine Möglichkeit, alle SSH-Sitzungen explizit anzuzeigen. Sie können diese Informationen ableiten, indem Sie Anmeldeinformationen von utmp
/ wtmp
über ein Tool wie last
, w
oder who
wie ich es gerade beschrieben habe lesen oder indem Sie Netzwerktools wie @sebelk verwenden, die in ihrer Antwort beschrieben wurden, um offene TCP-Verbindungen auf Port 22 zu finden (oder wo auch immer Ihre SSH-Daemons lauschen).
Ein dritter Ansatz, den Sie wählen könnten, besteht darin, die Protokollausgabe des SSH-Daemons zu analysieren. Abhängig von Ihrer Betriebssystemverteilung, SSH-Verteilung, Konfiguration usw. kann Ihre Protokollausgabe an verschiedenen Orten liegen. Auf einer RHEL 6-Box fand ich die Protokolle in /var/log/sshd.log
. Auf einer RHEL 7-Box und auch auf einer Arch Linux-Box musste ich verwenden, journalctl -u sshd
um die Protokolle anzuzeigen. Einige Systeme geben SSH-Protokolle möglicherweise an Syslog aus. Ihre Protokolle können an diesen Orten oder anderswo liegen. Hier ist ein Beispiel dessen, was Sie sehen könnten:
[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
Die Protokolle zeigen, wann Sitzungen geöffnet und geschlossen werden, wem die Sitzung gehört, von wo aus sich der Benutzer verbindet und mehr. Sie müssen jedoch Folgendes tun:vielder Analyse, wenn Sie dies von einem einfachen, für Menschen lesbaren Ereignisprotokoll in eine Liste der aktuell aktiven Sitzungen umwandeln möchten, und es wird wahrscheinlich immer noch keine genaue Liste sein, wenn Sie mit der Analyse fertig sind, da die Protokolle nicht genügend Informationen enthalten, um festzustellen, welche Sitzungen noch aktiv sind – Sie raten im Wesentlichen nur. Der einzige Vorteil, den Sie durch die Verwendung dieser Protokolle erzielen, besteht darin, dass die Informationen direkt von SSHD stammen und nicht wie bei den anderen Methoden über eine Quelle aus zweiter Hand.
Ich empfehle, einfach zu verwenden w
. In den meisten Fällen erhalten Sie damit die gewünschten Informationen.
Antwort2
Sie können jede SSH-Sitzung mit dem folgenden Befehl anzeigen:
[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
Oder vielleicht ist das hier nützlich:
[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:
Antwort3
Erweiterung der Antwort von @sebelk:
Die Lösung mit netstat
ist gut, erfordert aber Root-Rechte. Darüber hinaus wurde das net-tools
Paket (das bereitstellt netstat
) in einigen neueren Linux-Distributionen als veraltet markiert (https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/).
netstat
Eine alternative Lösung besteht dann darin, den Ersatz für , zu verwenden ss
. Beispiel (beachten Sie, dass Sie root nicht mehr benötigen):
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
Antwort4
Zur einfachen Referenz hinzugefügt.
Wenn Sie sich in einer Pseudo-Shell befinden (Beispiel: /dev/pts/0 ), wäre eine der einfachsten Möglichkeiten:
[user1@host ~]$ echo $SSH_CONNECTION
Es sollte Folgendes zurückgeben: Ihre IP und Ihr Port sowie die IP, mit der Sie verbunden sind, und der Port
192.168.0.13 50473 192.168.0.22 22
Sie können auch einige Informationen erhalten, indem Sie tty
oder who
( w
) verwenden: (Bearbeiten: Ich sehe, dass es jetzt oben in einem anderen Beitrag aufgeführt ist)
[user1@host ~]$ who
user1 tty1 2018-01-03 18:43
user2 pts/0 2018-01-03 18:44 (192.168.0.13)