¿Enumerar todas las sesiones SSH conectadas?

¿Enumerar todas las sesiones SSH conectadas?

Simplemente hice SSH en root y luego SSH nuevamente en root en la misma máquina. Entonces tengo dos ventanas abiertas, ambas con SSH en la raíz de mi máquina remota.

Desde el shell, ¿cómo puedo ver una lista de estas dos sesiones?

Respuesta1

whoo w; who -apara informacion adicional.

Estos comandos simplemente muestran todas las sesiones de inicio de sesión en un dispositivo terminal. Una sesión SSH se realizará en un pseudo-terminal esclavo ( pts) como se muestra en la TTYcolumna, pero no todas las conexiones pts son sesiones SSH. Por ejemplo, los programas que crean un dispositivo pseudoterminal como xtermo screense mostrarán como pts. VerDiferencia entre pts y ttypara una mejor descripción de los diferentes valores que se encuentran en la TTYcolumna. Además, este enfoque no mostrará a nadie que haya iniciado sesión en una sesión SFTP, ya que las sesiones SFTP no son sesiones de inicio de sesión de shell.

No conozco ninguna forma de mostrar explícitamente todas las sesiones SSH. Puede inferir esta información leyendo la información de inicio de sesión desde utmp/ wtmpa través de una herramienta como last, wo whocomo acabo de describir, o usando herramientas de red como @sebelk descritas en su respuesta para encontrar conexiones tcp abiertas en el puerto 22 (o dondequiera que esté su SSH). demonio(s) está(n) escuchando).

Un tercer enfoque que podría adoptar es analizar la salida del registro del demonio SSH. Dependiendo de la distribución de su sistema operativo, distribución SSH, configuración, etc., la salida de su registro puede estar en varios lugares diferentes. En una caja RHEL 6, encontré los registros en /var/log/sshd.log. En una caja RHEL 7, y también en una caja Arch Linux, necesitaba usarlo journalctl -u sshdpara ver los registros. Algunos sistemas pueden generar registros SSH en syslog. Sus registros pueden estar en estos lugares o en otros lugares. Aquí tienes una muestra de lo que podrías ver:

[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

Los registros muestran cuándo se abren y cierran las sesiones, a quién pertenece la sesión, desde dónde se conecta el usuario y más. Sin embargo, tendrás que hacer unlotede análisis si desea pasar de un registro de eventos simple y legible por humanos a una lista de sesiones actualmente activas, y aún así probablemente no será una lista precisa cuando haya terminado de analizar, ya que los registros no En realidad, contienen suficiente información para determinar qué sesiones aún están activas; básicamente, solo estás adivinando. La única ventaja que obtiene al utilizar estos registros es que la información proviene directamente de SSHD en lugar de a través de una fuente de segunda mano como los otros métodos.

Recomiendo simplemente usar w. La mayoría de las veces, esto le brindará la información que desea.

Respuesta2

Puedes ver cada sesión ssh con el siguiente comando:

[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 quizás esto pueda resultar útil:

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



       

Respuesta3

Ampliando la respuesta de @sebelk:

La solución que utiliza netstates buena pero requiere privilegios de root. Además, el net-toolspaquete (que proporciona netstat) quedó obsoleto en algunas distribuciones de Linux más nuevas (https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/).

Una solución alternativa es utilizar el reemplazo de netstat, ss. Por ejemplo (tenga en cuenta que ya no necesita 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

Respuesta4

Agregado para referencia simple.

Si está en un pseudo shell (ejemplo: /dev/pts/0 ), una de las formas más sencillas sería:

[user1@host ~]$ echo $SSH_CONNECTION

Debería devolver: su ip y puerto y la ip a la que está conectado y el puerto

192.168.0.13 50473 192.168.0.22 22

También puede obtener información usando ttyo who( w): (editar: veo que ahora está en la lista anterior en otra publicación)

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

información relacionada