¿Enumerar todas las sesiones SSH conectadas?


184

Simplemente SSH'd en la raíz, y luego SSH'd nuevamente en la raíz en la misma máquina. Así que tengo dos ventanas abiertas, ambas SSH'd en la raíz en mi máquina remota.

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

Respuestas:


188

whoo w; who -apara informacion adicional.

Estos comandos solo muestran todas las sesiones de inicio de sesión en un dispositivo terminal. Una sesión SSH estará en un pseudo-terminal esclavo ( pts) como se muestra en la TTYcolumna, pero no todas las conexiones de pts son sesiones SSH. Por ejemplo, los programas que crean un dispositivo pseudo-terminal como xtermo screense mostrarán como pts. Vea Diferencia entre pts y tty para una mejor descripción de los diferentes valores encontrados 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 información de inicio de sesión desde utmp/ a wtmptravés de una herramienta como last, wo whocomo acabo de describir, o utilizando herramientas de red como @sebelk descritas en su respuesta para encontrar conexiones TCP abiertas en el puerto 22 (o donde sea que su SSH daemon (s) está / está escuchando).

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

[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

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á que analizar mucho si desea obtener esto de un registro de eventos simple y legible por humanos a una lista de sesiones actualmente activas, y probablemente aún no sea una lista precisa cuando ya ha terminado de analizar, ya que los registros no contienen realmente suficiente información para determinar qué sesiones siguen activas, esencialmente solo está adivinando. La única ventaja que obtiene al usar 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 solo usar w. La mayoría de las veces, esto le dará la información que desea.



Encontré esto mientras buscaba un problema relacionado tangencialmente. No importa ¡Esta es una de las mejores respuestas que he visto en cualquier sitio de Stack! Ahora sé mucho más sobre esta área en particular (por falta de una palabra mejor). EDITAR: ¡Gracias!
jscharf

107

Puede 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 puede ser ú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:

44
Gracias; esta respuesta es mucho mejor que la respuesta principal, que solo enumera los usuarios que han iniciado sesión en un shell. Esta solución también encuentra usuarios de SFTP.
Hayden Schiff

1
en la mayoría de las cajas de hoy en día se puede usarpgrep -ai sshd
ccpizza

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

2
@ MartinSchröder: -isolo está disponible en sabores mac / bsd. en ubuntu puedes usar pgrep -af ssd. Consulte serverfault.com/a/883270/116777 para obtener más detalles
ccpizza del

Al igual que @HaydenSchiff, también tuve que encontrar usuarios que solo tengan un túnel SSH abierto para el reenvío de puertos, sin shell. Esto ayudó!
Tobias K.


7

Añadido para referencia simple.

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

[user1@host ~]$ echo $SSH_CONNECTION

Debería volver: 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 al usar 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)

Ampliar las respuestas anteriores que tratan sobre los globales de Bash. ¿Puedo sugerir hacer referencia a lo SECONDSglobal? Puede usar esta vía echo $SECONDS, que luego muestra la cantidad de tiempo, desde la conexión percibida
NerdOfCode

Esto mostrará información para la sesión actualmente activa, en la que está escribiendo. Pero la pregunta pregunta cómo enumerar todas las sesiones conectadas actualmente .
G-Man

6

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ó en desuso 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 entonces para usar el reemplazo para 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

2

Puedes usar

last | head

Usé esto en mi script .login durante años para ver quién había iniciado sesión recientemente en el sistema. Era un dispositivo de seguridad para hombres pobres para ver si alguien estaba en el sistema usando su inicio de sesión.


1
... pero no será necesariamente una lista de sesiones activas (de qué se trata esta pregunta). Dependiendo de la actividad de inicio de sesión, incluso la sesión en la que se ejecutó lastpuede no estar listada.
muru

1
"last -p now" enumera todas las sesiones ssh actuales.
JO Williams

@JOWilliams ¿Qué versión de lastsoporte -p? ¿Qué hace?
mwfearnley

@mwfearnley versión de lo "last from util-linux 2.31.1"tiene seguro.
V.7
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.