2/12/2008


Usos de Lsof

lsof es una conocida herramienta de detección de intrusión en sistemas, que nos muestra todos los archivos que mantiene abiertos un determinado ID de proceso (PID), incluyendo los sockets abiertos.

Proporciona una lista de todos los puertos que estén abiertos y demás información adicional. Si no se indica ninguna opción restrictiva, lsof enumera todos los archivos abiertos en ese momento, que normalmente suelen ser bastantes.

Source: http://es.wikipedia.org/wiki/Lsof

Aunque wikipedia lo reconozca como un IDS yo no creo que fué hecho para tal fin. Ahora les voy a describir los usos de esta estupenda herramienta.

Para instalarlo: pacman -S lsof (Arch)

Desmontando un CD rebelde.

# umount /cdrom
umount: /cdrom: device is bus


Vaya, ¡¿por qué no se desmonta y me dice que el dispositivo está ocupado?! No se ha desmontado
porque algun proceso esta haciendo uso del CDROM y hasta que no lo libere no podremos
desmontarlo, el problema es que desconocemos que aplicacion se encuentra usando dicho CDROM,
mediante lsof podremos conocerlo.

# lsof +D /cdrom
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
konqueror 621 zx80 cwd DIR 3,64 2048 57344 /cdrom


lsof nos dice que el proceso konqueror está usando el directorio /cdrom con el usuario zx80. La
solución es sencilla entoces, basta con cerrar konqueror y problema resuelto. Para los que usamos
mucho la consola y llegamos a tener unas cuantas sesiones abiertas pasa que en vez de konqueror
puede salir bash. Esto es debido a que alguna de las consolas está dentro del directorio activo del
cd- rom, por lo que bastaría salirse del directorio de trabajo del CD o cerrar ese bash.

# kill 621

Ya podemos desmontar.

Quien está detrás de una conexión.

Esta vez usamos la herramienta netstat. Para quien no conozca esta herramient a decir que
es un monitor de red. Nos dirá qué conexiones activas tenemos y mucha información sobre ellas.
Vamos a ver qué conexiones tenemos activas:

# netstat -n
Active Internet connections (only servers)
Proto Recv- Q Send- Q Local Address Foreign Address State
tcp 0 0 *:printer *:* LISTEN
tcp 0 0 localhost:www *:* LISTEN
tcp 0 0 *:6000 *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN


Nos muestra información sobre algunos puertos en espera (Listen) pero desconocemos qué
aplicación está detrás. Me llama la atención el puerto TCP 6000, así que voy a ver quien está detrás:

# lsoft -i :6000
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
X 279 root 3u Ipv4 349 TCP *:3000 (LISTEN)



Vemos que la aplicacion X es la culpable de que el puer to 6000 esté abierto y a la espera.
Qué procesos están usando un directorio.
Una de las utilidades que más se usan es averiguar qué aplicaciones están trabajndo en un
directorio concreto. Se usa esta opción sobre todo para vigilar el uso de troyanos o espias.

Que procesos utilizan mi directorio?

Si quisiera saber qué procesos están usando mi directorio pondría lo siguiente:

# lsof +D /home/zx80
xmms 7680 zx80 cwd DIR 3,67 4096 1175041 /home/zx80
xmms 7681 zx80 cwd DIR 3,67 4096 1175041 /home/zx80
nedit 15073 zx80 cwd DIR 3,67 4096 1175041 /home/zx80
wterm 15316 root cwd DIR 3,67 4096 1175041 /home/zx80
amule 7574 zx80 12u REG 3,67 728643584 1191570 /home/zx80 / .aMule /Temp /
001.part


Vemos que mi directorio HOME lo están usando 2 usuarios, yo mismo y root, y aparte me muestra las aplicaciones que hacen uso del directorio, Genial !!

Una versión recortada es el uso de la "d" en minuscula, que solo nos dará la aplicación en curso, sin los archivos que dicha aplicación esté usando.

# lsof +D /home/zx80
xmms 7680 zx80 cwd DIR 3,67 4096 1175041 /home/zx80
xmms 7681 zx80 cwd DIR 3,67 4096 1175041 /home/zx80
nedit 15073 zx80 cwd DIR 3,67 4096 1175041 /home/zx80
wterm 15316 root cwd DIR 3,67 4096 1175041 /home/zx80
amule 7574 zx80 12u REG 3,67 728643584 1191570 /home/zx80


En éste caso no me muestra el archivo 001.part que tiene abierto el amule.
Otros usos.
Estos son otros usos de la herramienta lsof, que aunque son algo menos usados nos pueden
sacar de algun apuro o duda.

# lsof -g n:

Donde n es un ID de grupo.

Estomuestra los archivos abiertos por un grupo que
queramos. Si quisieramos ver los archivos de varios grupos a la vez, los separarñiamos por comas:

# lsof -g wheel,users
# lsof -u n: Donde n es un ID de usuario, lo que nos mostrará los archivos abiertos por ese
usuario. Al igual que con los grupos, se pueden especificar varios usuarios de una vez.
# lsof -l: Para no convertir el ID a nombre de usuario, útil en casos de logeos corruptos o sistemas
lentos.
#lsof - N: Nos muestra los archivos NFS abiertos.

Ver mas en: www.fentlinux.com/listing/manuales/lsof.pdf

1 comentarios:

Cristian said...

Muy útil. Lo use para ver los procesos oracle que continuaban ligados a un tablespace undo que había sido eliminado. Gracias por el post.