Comprobando quién está conectado por SSH en un sistema UNIX/Linux

By | June 18, 2015

Con paciencia. Esta vez no te va ser necesaria demasiada… tenemos a nuestra diposición unos sencillos comandos que dan interesante información al respecto sin necesidad de concatenar demasiados pipes u opciones.

En los ejemplos que voy a mencionar, como nota aclaratoria comentar: la IP 192.168.2.100 es la del servidor Linux (en concreto, un Debian) y la 192.168.2.101 sería mi desktop desde donde conecto por SSH al servidor.

Por una parte podemos utilizar lsof, que viene a ser List Open Files. En Linux los sockets de conexión no dejan de ser ficheros abiertos:

# Listar ficheros abiertos con lsof (list open files)

lsof -i -n | egrep '\<sshd\>' | grep ESTABLISHED

--------------------------------------------------------------------------------------------------------------------------

sshd      2425        root    3u  IPv4  21063      0t0  TCP 192.168.2.100:ssh->192.168.2.101:52712 (ESTABLISHED)
sshd      2427         bob    3u  IPv4  21063      0t0  TCP 192.168.2.100:ssh->192.168.2.101:52712 (ESTABLISHED)

Las líneas ESTABLISHED nos muestran las conexiones SSH abiertas así como la máquina desde la que está activa la conexión.

Otras herramientas como ps o who nos pueden dar valiosa información, aunque un poco menos precisa que lsof.

# Comprobar procesos con ps

ps -ef | grep -w "sshd:"

--------------------------------------------------------------------------------------------------------------------------

root      2425   471  0 12:41 ?        00:00:00 sshd: bob [priv]
bob       2427  2425  0 12:41 ?        00:00:00 sshd: bob@pts/1
bob       2896  2428  0 14:04 pts/1    00:00:00 grep -w sshd:

# who

who

--------------------------------------------------------------------------------------------------------------------------

bob      :0           2015-06-11 10:50 (:0)
bob      pts/0        2015-06-11 10:50 (:0)
bob      pts/1        2015-06-11 12:41 (192.168.2.101)

Y ahora vienen dos programas que vienen al dedo: finger y pinky. El segundo es un versión ligera del primero. Ambos nos permiten obtener información relativa a usuarios incluyendo momento de conexión, equipo remoto desde el que están conectados… para muestra vamos a ver unos ejemplos:

# Información de usuarios conectados con finger

finger

--------------------------------------------------------------------------------------------------------------------------

Login     Name       Tty      Idle  Login Time   Office     Office Phone
bob       bob       *:0             Jun 11 10:50 (:0)
bob       bob       *pts/0      49  Jun 11 10:50 (:0)
bob       bob       *pts/1          Jun 11 12:41 (192.168.2.101)

# pinky, la versión light de finger
# La utilidad pertenece al paquete coreutils, por si no lo tienes instalado (cosa rara ya que suele estarlo)

pinky

--------------------------------------------------------------------------------------------------------------------------

Login    Name                 TTY      Idle   When             Where
bob      bob                 ?:0       ?????  2015-06-11 10:50 :0
bob      bob                 *pts/0    00:49  2015-06-11 10:50 :0
bob      bob                 *pts/1           2015-06-11 12:41 192.168.2.101

Por otro lado tenemos unos cuantos comandos de red que pueden ser muy útiles para depurar y ver quién está conectado a nuestra máquina:

# netstat para ver las conexiones de red de nuestra máquina

netstat -ap | grep 'ESTABLISHED.*ssh'

--------------------------------------------------------------------------------------------------------------------------

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0     64 debianwithgnome:ssh     192.168.2.101:52712     ESTABLISHED 2425/sshd: bob

# nethogs: ver ancho de banda consumido por cada proceso
# puedes instalarlo con el paquete que lleva el mismo nombre

nethogs eth0

# estadísticas por socket de conexión con ss (sockets statistics)

ss | grep ssh

--------------------------------------------------------------------------------------------------------------------------

Netid  State      Recv-Q Send-Q   Local Address:Port      Peer Address:Port
tcp    ESTAB      0      64       192.168.2.100:ssh       192.168.2.101:52712

Habrá más maneras, pero estas desde luego son bastante fáciles de añadir a la navaja suiza del día a día de la administración del sistema.