¿Cómo puedo obtener más información sobre los archivos de socket en / proc / fd?

33

Mirando en / proc / $ mypid / fd /, veo estos archivos

lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 0 -> /dev/pts/36 (deleted)
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 3 -> socket:[1424055856]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 4 -> socket:[1424055868]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 5 -> socket:[1424055882]

Como tengo acceso al código, sé que estos sockets están vinculados a conexiones TCP (uno es una conexión al puerto 5672 en alguna máquina, otro es una conexión al puerto 3306 en alguna otra máquina), pero quiero saber qué socket es atado a qué conexión. ¿Cómo puedo hacer eso?

En términos más generales, ¿cómo puedo preguntarle al sistema operativo qué hay en el otro extremo del socket?

benhsu
fuente
1
Uso socat....
heemayl
Vea también ¿Quién tiene el otro extremo de este par de socket Unix?
Gilles 'SO- deja de ser malvado'

Respuestas:

40

Comando lsof

Una buena opción podría ser lsof. Como man lsofafirma, es útil para obtener información sobre open files such as Internet sockets or Unix Domain sockets.


Usándolo

Al principio, obtenga una descripción general /proc/$PID/fd/y los números de socket enumerados.
Por ejemplo, socket:[14240]podría interesarte.

Luego, use lsof -i -a -p $PIDpara imprimir una lista de todos los $PIDusos de los archivos de red .

  • -i produce una lista de archivos de red que pertenecen a un usuario o proceso

  • -a combina lógicamente o parámetros dados de AND

  • -p $PID selecciona información solo sobre su proceso

Una salida típica para mi navegador que se ejecuta con un PID de 2543podría ser:

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
browser 2543 pidi   55u  IPv4  14240      0t0  TCP  pidi.router.lan:55038->stackoverflow.com:https (ESTABLISHED)

y más líneas similares.

¡Excelente! Ahora mire más de cerca la DEVICEcolumna. ¡Coincide con nuestro zócalo listado anteriormente de /proc/$PID/fd/!
Y gracias a la NAMEsección podemos decir cuál es el otro extremo de nuestro zócalo.

En una ejecución en el mundo real, puede obtener una buena cantidad de salida, pero solo filtra o greppor su socket de interés.

Estoy bastante seguro de que uno podría combinar todos los comandos, pero eso debería ser suficiente para comenzar.

pidi
fuente
¡Gracias! Votado y aceptado. Veo un socket que aparece en lsof como "unix 0xffff88002704d380 0t0 1423733559 socket", ¿cómo profundizo en lo que es 0xffff88002704d380?
benhsu
1
"unix 0xfff ..." parece la dirección de memoria del núcleo de una estructura unix_sock. Esta estructura contiene un puntero a su punto final de socket. Echa un vistazo a grep -rni ffff88002704d380 /proc. en algún lugar debajo de / proc / puede encontrar su respuesta, catsu archivo grep encontrado. Pero no me apuntes sobre esto ... Puede estar horrible mal aquí.
pidi
lsoflee otra información sobre la toma de /proc/net/tcp, /proc/net/tcp6, /proc/net/udp, y así sucesivamente dependiendo del tipo de enchufe.
Jesin