Lister toutes les sessions SSH connectées?

184

J'ai juste SSH dans root, puis SSH dans root sur la même machine. J'ai donc deux fenêtres ouvertes SSH'd dans root sur mon ordinateur distant.

À partir du shell, comment puis-je voir une liste de ces deux sessions?

le miroir
la source

Réponses:

188

whoou w; who -apour plus d'informations.

Ces commandes affichent simplement toutes les sessions de connexion sur un terminal. Une session SSH sera sur un pseudo-terminal esclave ( pts) comme indiqué dans la TTYcolonne, mais toutes les connexions pts ne sont pas des sessions SSH. Par exemple, les programmes qui créent un périphérique pseudo-terminal tel que xtermou screens’affichent comme pts. Voir Différence entre pts et tty pour une meilleure description des différentes valeurs trouvées dans la TTYcolonne. De plus, cette approche n’indiquera à personne qui est connecté à une session SFTP, car les sessions SFTP ne sont pas des sessions de connexion shell.

Je ne connais aucun moyen de montrer explicitement toutes les sessions SSH. Vous pouvez déduire ces informations en lisant les informations de connexion depuis utmp/ wtmpvia un outil tel que last, wou whocomme je viens de le décrire, ou en utilisant des outils réseau tels que @sebelk, décrits dans leur réponse, pour rechercher des connexions tcp ouvertes sur le port 22 le (s) démon (s) écoute (s)).

Une troisième approche consiste à analyser la sortie du journal du démon SSH. Selon la distribution de votre système d'exploitation, la distribution SSH, la configuration, etc., la sortie de votre journal peut se trouver à différents endroits. Sur une boîte RHEL 6, j'ai trouvé les journaux /var/log/sshd.log. Sur une boîte RHEL 7, et également sur une boîte Arch Linux, je devais utiliser journalctl -u sshdpour afficher les journaux. Certains systèmes peuvent générer des journaux SSH vers syslog. Vos journaux peuvent être dans ces endroits ou ailleurs. Voici un exemple de ce que vous pourriez voir:

[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

Les journaux indiquent quand les sessions s'ouvrent et se ferment, à qui appartient la session, à partir duquel l'utilisateur se connecte, etc. Cependant, vous allez devoir faire beaucoup d'analyses si vous voulez obtenir cela d'un simple journal d'événements lisible par l'homme en une liste de sessions actives, et ce ne sera probablement pas une liste précise quand. vous avez terminé l'analyse, car les journaux ne contiennent pas assez d'informations pour déterminer les sessions qui sont toujours actives - vous ne faites que deviner. Le seul avantage que vous obtenez en utilisant ces journaux est que les informations proviennent directement de SSHD plutôt que via une source secondaire comme les autres méthodes.

Je recommande simplement d'utiliser w. La plupart du temps, cela vous donnera les informations que vous souhaitez.

Jayhendren
la source
2
Connexes: Comprendre le résultat de la who -acommande
Serge Stroobandt
Trouvé ceci en cherchant un problème apparenté tangentiellement. Peu importe C'est l'une des meilleures réponses que j'ai vues sur tous les sites Stack! J'en sais maintenant beaucoup plus sur ce domaine particulier (faute d'un meilleur mot). EDIT: Merci!
jscharf
107

Vous pouvez voir chaque session ssh avec la commande suivante:

[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 peut-être cela peut être utile:

[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:
sebelk
la source
4
Je vous remercie; cette réponse est bien meilleure que la première réponse, qui répertorie uniquement les utilisateurs connectés à un shell. Cette solution trouve également les utilisateurs SFTP.
Hayden Schiff
1
De nos jours, vous pouvez utiliser la plupart des boîtes.pgrep -ai sshd
ccpizza
@ccpizza: pgrep: invalid option -- 'i'sur Ubuntu 14.04.
Martin Schröder
2
@ MartinSchröder: -iest disponible uniquement sur les goûts Mac / BSD. sur Ubuntu, vous pouvez utiliser pgrep -af ssd. Voir serverfault.com/a/883270/116777 pour plus de détails
ccpizza
Semblable à @HaydenSchiff, je devais également trouver des utilisateurs disposant uniquement d'un tunnel SSH ouvert pour la redirection de port, sans shell. Cela a aidé!
Tobias K.
14

Vous pouvez aussi utiliser

ps ax | grep sshd
Joel Inglao
la source
7

Ajouté pour référence simple.

Si vous êtes dans un pseudo-shell (exemple: / dev / pts / 0), l’un des moyens les plus simples serait:

[user1@host ~]$ echo $SSH_CONNECTION

Il devrait renvoyer: votre ip et votre port et l'ip à laquelle vous êtes connecté et votre port

192.168.0.13 50473 192.168.0.22 22

Vous pouvez également obtenir des informations en utilisant ttyor who( w): (edit: je vois que c'est maintenant la liste ci-dessus dans un autre post)

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

la source
Pour développer les réponses précédentes concernant les globales Bash. Puis-je suggérer de référencer le SECONDSglobal. Vous pouvez utiliser ce via echo $SECONDS, qui affiche ensuite la durée
écoulée
Cela affichera des informations sur la session actuellement active - celle dans laquelle vous tapez. Mais la question demande comment répertorier toutes les sessions actuellement connectées .
G-Man
6

Développer la réponse de @ sebelk:

L'utilisation de la solution netstatest bonne mais nécessite des privilèges root. De plus, le net-toolspaquet (qui fournit netstat) était déconseillé dans certaines distributions récentes de la distribution Linux ( https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/ ).

Une autre solution consiste alors à utiliser le remplacement pour netstat, ss. Par exemple (notez que vous n’avez plus besoin de 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
A. Meijer
la source
2

Vous pouvez utiliser

last | head

J'ai utilisé cela dans mon script .login pendant des années pour voir qui s'était récemment connecté au système. C'était un dispositif de sécurité pour homme pauvre pour voir si quelqu'un se trouvait sur le système en utilisant votre identifiant.

JO Williams
la source
1
... mais ce ne sera pas nécessairement une liste de sessions actives (en quoi consiste cette question). Selon l'activité de connexion, même la session que vous avez exécutée lastpeut ne pas être répertoriée.
muru
1
"last -p now" répertorie toutes les sessions ssh en cours.
JO Williams
@ JOWilliams Quelle version des lastsupports -p? Qu'est ce que ça fait?
Mwfearnley le
La version @ mwfearnley de l' "last from util-linux 2.31.1"a à coup sûr.
V.7