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