Saltar la navegación

lsof

El comando lsof muestra información sobre los ficheros que tiene abiertos el sistema, incluidos los sockets IPv4 e IPv6.

Si no se especifica ninguna opción se muestran todos los ficheros abiertos por todos los procesos del sistema. Con la opción -i podemos ver solo los sockets abiertos IPv4 e IPv6:

# lsof -i
COMMAND     PID        USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
exim4      2887 Debian-exim    3u  IPv4    6459      0t0  TCP localhost:smtp (LISTEN)
exim4      2887 Debian-exim    4u  IPv6    6460      0t0  TCP localhost:smtp (LISTEN)
cupsd      2920        root    6u  IPv6 1366407      0t0  TCP localhost:ipp (LISTEN)
cupsd      2920        root    8u  IPv4 1366408      0t0  TCP localhost:ipp (LISTEN)
cupsd      2920        root   10u  IPv4 1366411      0t0  UDP *:ipp
inetd      3039        root    4u  IPv4    7486      0t0  TCP *:telnet (LISTEN)
minissdpd  3102        root    4u  IPv4    7533      0t0  UDP *:1900
firefox    4159     usuario   76u  IPv4 1474188      0t0  TCP localhost:38636->localhost:51236 (ESTABLISHED)
firefox    4159     usuario   87u  IPv4  802678      0t0  UDP *:42959
firefox    4159     usuario   90u  IPv4 1471455      0t0  TCP Legolas.local:47518->187.219.106.212.static.jazztel.es:http (ESTABLISHED)
firefox    4159     usuario   94u  IPv4 1473814      0t0  TCP Legolas.local:59071->a173-222-99-63.deploy.static.akamaitechnologies.com:http (ESTABLISHED)
firefox    4159     usuario   98u  IPv4 1473877      0t0  TCP Legolas.local:37256->121.219.106.212.static.jazztel.es:https (ESTABLISHED)
dhclient   4475        root    6u  IPv4 1356172      0t0  UDP *:bootpc
dhclient   4475        root   20w  IPv4 1356160      0t0  UDP *:57446
dhclient   4475        root   21u  IPv6 1356161      0t0  UDP *:53139
exe       12586     usuario    4u  IPv4 1472959      0t0  TCP localhost:51236->localhost:38636 (ESTABLISHED)
exe       12586     usuario    5u  IPv4 1458730      0t0  TCP localhost:51236 (LISTEN)
exe       22169     usuario    4u  IPv4  148592      0t0  TCP localhost:51235 (LISTEN

La opción -n evita que se haga resolución de nombres y por tanto al mostrarse solo las IP y no los nombres, el comando funciona más rápido. Por otro lado, para que los puertos también aparezcan en forma numérica, hay que usar la opción -P:

# lsof -nP -i
COMMAND     PID        USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
exim4      2887 Debian-exim    3u  IPv4    6459      0t0  TCP 127.0.0.1:25 (LISTEN)
exim4      2887 Debian-exim    4u  IPv6    6460      0t0  TCP [::1]:25 (LISTEN)
cupsd      2920        root    6u  IPv6 1366407      0t0  TCP [::1]:631 (LISTEN)
cupsd      2920        root    8u  IPv4 1366408      0t0  TCP 127.0.0.1:631 (LISTEN)
cupsd      2920        root   10u  IPv4 1366411      0t0  UDP *:631
inetd      3039        root    4u  IPv4    7486      0t0  TCP *:23 (LISTEN)
firefox    4159     usuario   84r  IPv4 1477914      0t0  TCP 192.168.1.52:48618->193.110.128.199:80 (ESTABLISHED)
firefox    4159     usuario   85r  IPv4 1478061      0t0  TCP 192.168.1.52:51919->192.243.254.49:80 (ESTABLISHED)
firefox    4159     usuario   87u  IPv4  802678      0t0  UDP *:42959
dhclient   4475        root    6u  IPv4 1356172      0t0  UDP *:68
dhclient   4475        root   20w  IPv4 1356160      0t0  UDP *:57446
dhclient   4475        root   21u  IPv6 1356161      0t0  UDP *:53139
exe       12586     usuario    4u  IPv4 1476921      0t0  TCP 127.0.0.1:51236->127.0.0.1:38647 (ESTABLISHED)
exe       12586     usuario    5u  IPv4 1458730      0t0  TCP 127.0.0.1:51236 (LISTEN)
exe       22169     usuario    4u  IPv4  148592      0t0  TCP 127.0.0.1:51235 (LISTEN)

La opción -i puede ir acompañada de la siguiente expresión para restringir los ficheros que se mostrarán y repetirse cuantas veces se quiera formando una condición OR:

[4|6][protocol][@{hostname|hostaddr}][:{service|port}]

4 Sólo muestra los sockets IPv4.
6 Sólo muestra los sockets IPv6.
protocol TCP o UDP.
@hostname     El nombre de un equipo de internet.
hostaddr La IP de un equipo de internet.
:service Nombre de un puerto. Los nombres de los puertos y el número asociado a ellos está en /etc/services.
port Número de un puerto

Por ejemplo, los sockets abiertos IPv4 y TCP:

# lsof -nP -i 4TCP
COMMAND     PID        USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
rpcbind    1812        root    8u  IPv4    5011      0t0  TCP *:111 (LISTEN)
rpc.statd  1843       statd    8u  IPv4    5908      0t0  TCP *:55179 (LISTEN)
exim4      2887 Debian-exim    3u  IPv4    6459      0t0  TCP 127.0.0.1:25 (LISTEN)
cupsd      2920        root    8u  IPv4 1366408      0t0  TCP 127.0.0.1:631 (LISTEN)
inetd      3039        root    4u  IPv4    7486      0t0  TCP *:23 (LISTEN)
firefox 4159 usuario  111u  IPv4 1491807      0t0  TCP 192.168.1.52:34266->37.187.147.44:80 (ESTABLISHED)
firefox 4159 usuario  144u  IPv4 1491767      0t0  TCP 192.168.1.52:46478->74.125.230.3:80 (ESTABLISHED)
exe       12586     usuario    4u  IPv4 1490326      0t0  TCP 127.0.0.1:51236->127.0.0.1:39124 (ESTABLISHED)
exe       12586     usuario    5u  IPv4 1458730      0t0  TCP 127.0.0.1:51236 (LISTEN)
exe       22169     usuario    4u  IPv4  148592      0t0  TCP 127.0.0.1:51235 (LISTEN)

O los IPv4, TCP y puerto 80:

# lsof -nP -i 4TCP:80
COMMAND     PID        USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
firefox 4159 usuario  111u  IPv4 1491807      0t0  TCP 192.168.1.52:34266->37.187.147.44:80 (ESTABLISHED)
firefox 4159 usuario  144u  IPv4 1491767      0t0  TCP 192.168.1.52:46478->74.125.230.3:80 (ESTABLISHED)

Todos los sockets abiertos en el puerto 25 o en el 80:

# lsof -nP -i :80 -i :25
COMMAND  PID        USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
exim4   2887 Debian-exim    3u  IPv4    6459      0t0  TCP 127.0.0.1:25 (LISTEN)
exim4   2887 Debian-exim    4u  IPv6    6460      0t0  TCP [::1]:25 (LISTEN)
firefox 4159     usuario   84r  IPv4 1497640      0t0  TCP 192.168.1.52:55150->74.125.206.95:80 (ESTABLISHED)
firefox 4159     usuario   85r  IPv4 1497655      0t0  TCP 192.168.1.52:41623->173.194.40.110:80 (ESTABLISHED)
firefox 4159     usuario   95u  IPv4 1497632      0t0  TCP 192.168.1.52:36342->205.196.120.8:80 (ESTABLISHED)

O bien:

# lsof -nP -i :80,25

Podríamos mostrar solo los ficheros abiertos por un proceso cuyo PID conocemos, esto se haría con la opción -p pid, y si además nos interesa solo los sockets y no el resto de ficheros, usaríamos -i como ya hemos visto. Pero la cuestión a tener en cuenta es que al unir -p y -i se construye una condición OR y nos interesa, en este caso, una condición AND, por lo que hay que usar la opción -a:

# lsof -nP -a -i -p 4475
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
dhclient 4475 root    6u  IPv4 1356172      0t0  UDP *:68
dhclient 4475 root   20w  IPv4 1356160      0t0  UDP *:57446
dhclient 4475 root   21u  IPv6 1356161      0t0  UDP *:53139

La búsqueda podría hacerse por nombre del proceso con -c; la siguiente opción muestra todos los ficheros abiertos por procesos cuyo nombre empieza por la cadena que acompaña a -c. Esta cadena podría ser una expresión regular:

# lsof -nP -a -i -c dhclient
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
dhclient 4475 root    6u  IPv4 1356172      0t0  UDP *:68
dhclient 4475 root   20w  IPv4 1356160      0t0  UDP *:57446
dhclient 4475 root   21u  IPv6 1356161      0t0  UDP *:53139

Otras opciones interesantes son:

-u [usuario|uid]     Muestra los ficheros abiertos por un usuario.
-g gid Muestra los ficheros abiertos por todos los usuarios del grupo especificado.  
-r n Ejecuta lsof ininterrumpidamente cada n segundos.
+d directorio Muestra todos los procesos que tengan abierto el directorio especificado o bien cualquiera de sus ficheros o directorios.
+D directorio Igual que +d, pero actúa de forma recursiva, es decir, sobre todo el árbol que cuelga del directorio especificado, éste incluido.  
nombre de partición    Muestra todos los ficheros abiertos de esa partición.
nombre de fichero Muestra todos los procesos que tienen abierto el fichero.
-s protocolo:estado    protocolo: TCP, UDP. estado: ESTABLISHED, LISTEN, CLOSE_WAIT, TIME_WAIT, IDLE, etc.

En muchas opciones se pueden poner rangos de valores separando los extremos con un guión (-), o listas de valores separándolos con comas (,). También puede hacerse referencia a la exclusión del valor si este comienza por ^.

La orden lsof  tiene muchas posibilidades por lo que es aconsejable ver la página del manual del sistema.

# man lsof

 

Licencia: licencia de software libre GPL