web-dev-qa-db-fra.com

Liste toutes les sessions SSH connectées?

Je viens de SSH dans root, puis SSH à nouveau dans root sur la même machine. J'ai donc deux fenêtres ouvertes à la fois SSH en root sur ma machine distante.

Depuis le Shell, comment puis-je voir une liste de ces deux sessions?

201
themirror

who ou w; who -a pour plus d'informations.

Ces commandes affichent simplement toutes les sessions de connexion sur un périphérique terminal. Une session SSH sera sur un esclave pseudo-terminal (pts) comme indiqué dans la colonne TTY, mais toutes les connexions pts ne sont pas des sessions SSH. Par exemple, les programmes qui créent un périphérique pseudo-terminal tels que xterm ou screen s'afficheront comme pts. Voir Différence entre pts et tty pour une meilleure description des différentes valeurs trouvées dans la colonne TTY. De plus, cette approche ne montrera personne connecté à une session SFTP, car les sessions SFTP ne sont pas des sessions de connexion Shell.

Je ne connais aucun moyen d'afficher explicitement toutes les sessions SSH. Vous pouvez déduire ces informations en lisant les informations de connexion de utmp/wtmp via un outil comme last, w ou who comme je 'viens de le décrire, ou en utilisant des outils de mise en réseau comme @sebelk décrits dans leur réponse pour trouver des connexions TCP ouvertes sur le port 22 (ou là où vos démons SSH écoutent/écoutent).

Une troisième approche que vous pouvez adopter 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 dans /var/log/sshd.log. Sur une box RHEL 7, et aussi sur une box Arch Linux, j'avais besoin d'utiliser journalctl -u sshd pour afficher les journaux. Certains systèmes peuvent générer des journaux SSH dans syslog. Vos journaux peuvent se trouver à ces endroits ou ailleurs. Voici un exemple de ce que vous pourriez voir:

[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

Les journaux indiquent quand les sessions s'ouvrent et se ferment, à qui appartient la session, d'où l'utilisateur se connecte, etc. Cependant, vous devrez faire beaucoup d'analyse si vous voulez obtenir cela d'un simple journal des événements lisible par un liste des sessions actuellement actives, et ce ne sera probablement pas une liste précise lorsque vous aurez terminé l'analyse, car les journaux ne contiennent pas suffisamment d'informations pour déterminer quelles sessions 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 d'occasion comme les autres méthodes.

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

207
jayhendren

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

Peut-être que 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:
119
sebelk

Vous pouvez aussi utiliser

ps ax | grep sshd
14
Joel Inglao

Développer la réponse de @ sebelk:

La solution utilisant netstat est bonne mais nécessite des privilèges root. De plus, le net-tools package (qui fournit netstat) a été déconseillé dans certaines distributions Linux plus récentes ( https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and -les-remplacements / ).

Une solution alternative consiste alors à utiliser le remplacement de 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
8
A.Meijer

Ajouté pour référence simple.

Si vous êtes dans un pseudo Shell (exemple:/dev/pts/0), l'une des façons les plus simples serait:

[user1@Host ~]$ echo $SSH_CONNECTION

Il devrait retourner: votre IP et votre port et l'IP auquel vous êtes connecté et votre port

192.168.0.13 50473 192.168.0.22 22

Vous pouvez également obtenir des informations en utilisant tty ou who (w): (modifier: 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)
8
user267194

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é médiocre pour voir si quelqu'un était sur le système en utilisant votre identifiant.

2
J.O. Williams

J'ai exécuté presque toutes les commandes ci-dessus et je pense que la meilleure façon de trouver les utilisateurs actuellement connectés via ssh est

last | grep "still logged in"

ET

who -a
0
Mian Asbat Ahmad