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?
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.
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:
Vous pouvez aussi utiliser
ps ax | grep sshd
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
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)
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.
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