Alle verbundenen SSH-Sitzungen auflisten?


184

Ich habe nur SSH in root und dann SSH wieder in root auf dem gleichen Computer. Ich habe also zwei Fenster, in denen beide SSH-Dateien in root auf meinem Remote-Computer geöffnet sind.

Wie kann ich in der Shell eine Liste dieser beiden Sitzungen anzeigen?

Antworten:


188

whooder w; who -afür weitere Informationen.

Diese Befehle zeigen nur alle Anmeldesitzungen auf einem Endgerät an. Eine SSH-Sitzung findet auf einem Pseudo-Terminal-Slave ( pts) statt, wie in der TTYSpalte gezeigt, aber nicht alle pts-Verbindungen sind SSH-Sitzungen. Zum Beispiel Programme, die ein Pseudo-Endgerät erstellen, wie zum Beispiel xtermoder screenwerden als angezeigt pts. Weitere Informationen zu den verschiedenen Werten in der TTYSpalte finden Sie unter Unterschied zwischen pts und tty . Außerdem wird bei diesem Ansatz niemandem angezeigt, der sich bei einer SFTP-Sitzung angemeldet hat, 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, woder whowie ich es gerade beschrieben habe, lesen oder indem Sie Netzwerk-Tools wie @sebelk verwenden, die in ihrer Antwort beschrieben sind, um offene TCP-Verbindungen auf Port 22 (oder wo auch immer Ihr SSH ist) zu finden Daemon (s) lauschen).

Ein dritter Ansatz besteht darin, die Protokollausgabe des SSH-Dämons zu analysieren. Abhängig von Ihrer Betriebssystemverteilung, SSH-Verteilung, Konfiguration usw. kann die Protokollausgabe an verschiedenen Stellen erfolgen. Auf einer RHEL 6 Box habe ich die Logs gefunden /var/log/sshd.log. Auf einer RHEL 7-Box und auch auf einer Arch Linux-Box musste ich journalctl -u sshdzum Anzeigen der Protokolle verwenden. Einige Systeme geben möglicherweise SSH-Protokolle an syslog aus. Ihre Protokolle befinden sich möglicherweise an diesen oder anderen Orten. Hier ist ein Beispiel dessen, was Sie sehen könnten:

[myhost ~]% cat /var/log/sshd.log | grep hendrenj | 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 der Benutzer eine Verbindung herstellt und vieles mehr. Sie müssen jedoch eine Menge Parsing durchführen, wenn Sie dies von einem einfachen, von Menschen lesbaren Ereignisprotokoll in eine Liste der derzeit aktiven Sitzungen übertragen möchten, und es wird wahrscheinlich immer noch keine genaue Liste sein, wenn Sie haben das Parsen abgeschlossen, da die Protokolle nicht genügend Informationen enthalten, um festzustellen, welche Sitzungen noch aktiv sind - Sie raten im Grunde genommen 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 gebrauchte Quelle.

Ich empfehle nur mit w. In den meisten Fällen erhalten Sie so die gewünschten Informationen.



Dies wurde bei der Suche nach einem tangentialen Problem festgestellt. Spielt keine rolle Dies ist eine der besten Antworten, die ich auf einer Stack-Site gesehen habe! Ich weiß jetzt eine Menge mehr über dieses spezielle Gebiet (mangels eines besseren Wortes). EDIT: Danke!
jscharf

107

Sie können jede Sitzung ssh 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

O vielleicht kann das nützlich sein:

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

4
Danke; Diese Antwort ist viel besser als die oberste Antwort, bei der nur Benutzer aufgelistet werden, die bei einer Shell angemeldet sind. Diese Lösung findet auch SFTP-Benutzer.
Hayden Schiff

1
auf den meisten Boxen können Sie heutzutage verwendenpgrep -ai sshd
ccpizza

@ccpizza: pgrep: invalid option -- 'i'unter Ubuntu 14.04.
Martin Schröder

2
@ MartinSchröder: -iist nur auf Mac / BSD-Flavours verfügbar. auf Ubuntu können Sie verwenden pgrep -af ssd. Siehe serverfault.com/a/883270/116777 für Details
ccpizza

Ähnlich wie bei @HaydenSchiff musste ich auch Benutzer finden, die nur einen SSH-Tunnel ohne Shell für die Portweiterleitung geöffnet haben. Das hat geholfen!
Tobias K.


7

Zur einfachen Bezugnahme hinzugefügt.

Wenn Sie sich in einer Pseudo-Shell befinden (Beispiel: / dev / pts / 0), ist einer der einfachsten Wege:

[user1@host ~]$ echo $SSH_CONNECTION

Es sollte zurückkehren: Ihre IP und Ihr Port und die IP, mit der Sie verbunden sind, und der Port

192.168.0.13 50473 192.168.0.22 22

Du kannst auch ein paar Informationen erhalten, indem du ttyoder who( w) verwendest: (Bearbeiten: Ich sehe die Liste oben in einem anderen Beitrag.)

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

Um die vorherigen Antworten zu erweitern, die sich mit Bash-Globalen befassen. Könnte ich vorschlagen, auf das SECONDSGlobale zu verweisen . Sie können dies über echo $SECONDS, die es dann die Zeitdauer anzeigt, seit die Verbindung wahrgenommen
NerdOfCode

Daraufhin werden Informationen für die derzeit aktive Sitzung angezeigt - die, in die Sie eingeben. In der Frage wird jedoch gefragt, wie alle derzeit verbundenen Sitzungen aufgelistet werden sollen.
G-Man

6

Erweiterung der Antwort von @ sebelk:

Die verwendete Lösung netstatist gut, erfordert jedoch Root-Rechte. Darüber hinaus wurde das net-toolsPaket (das bereitstellt netstat) in einigen neueren Linux-Distributionen verworfen ( https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-the-replacements/ ).

Eine alternative Lösung besteht dann darin, den Ersatz für netstat, zu verwenden ss. Zum 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

2

Sie können verwenden

last | head

Ich habe dies jahrelang in meinem .login-Skript verwendet, um zu sehen, wer sich kürzlich beim System angemeldet hat. Es war ein Sicherheitsgerät für arme Leute, um zu sehen, ob sich jemand mit Ihrem Login auf dem System befand.


1
... aber es muss nicht unbedingt eine Liste aktiver Sitzungen sein (worum es bei dieser Frage geht). Abhängig von der Anmeldeaktivität wird lastmöglicherweise nicht einmal die Sitzung aufgelistet , in der Sie sich angemeldet haben.
muru

1
"last -p now" listet alle aktuellen SSH-Sitzungen auf.
JO Williams

@JOWilliams Welche Version von lastunterstützt -p? Was tut es?
Mwfearnley

@mwfearnley Version von "last from util-linux 2.31.1"hat es sicher.
7.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.