¿Descubrir los detalles de un socket por el nombre de la ruta del socket?

¿Descubrir los detalles de un socket por el nombre de la ruta del socket?

Ejecuté un straceerror en una aplicación cliente y obtuve algo como esto:

socket(PF_LOCAL, SOCK_SEQPACKET|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
setsockopt(3, SOL_SOCKET, SO_PASSCRED, [1], 4) = 0
connect(3, {sa_family=AF_LOCAL, sun_path="/path/to/socket"}, 19) = -1 EPROTOTYPE (Protocol wrong type for socket)
close(3)                                = 0
exit_group(2)                           = ?
+++ exited with 2 +++

Entonces intentéadivinarel tipo de socket emulando el socket existente con varios parámetros socat, pero fue en vano.

También miré el código de esta respuesta.aquí, pero parece estar creando un socket, sin usar uno existente, y parece que no puedo encontrar cómo obtener un socket de una ruta.

Sin profundizar en el código fuente, ¿existe una manera fácil de determinar los detalles (como el tipo de protocolo) de un socket existente a partir de la ruta del socket (si existe)?

Respuesta1

Puedes usar lsof /path/to/socket:

COMMAND     PID USER   FD   TYPE             DEVICE SIZE/OFF      NODE NAME
hindsight 19619 root    6u  unix 0xffff88038612b480      0t0 257123917 /path/to/socket

Conociendo el PIDpodrás saber más sobre el proceso en sí:

cat /proc/19619/io 
rchar: 11635200437
wchar: 2722080850
syscr: 16905056
syscw: 920240
read_bytes: 36397568
write_bytes: 3515994112
cancelled_write_bytes: 760422400

O podría usarlo sspara mostrar todos los sockets Unix.

ss -x
  • -xMostrar sockets de dominio Unix
  • -eMostrar información detallada del socket
  • -mMostrar uso de memoria del socket

y puedes filtrar por algún tipo:

ss -x -A unix_stream

información relacionada