Ejecuté un strace
error 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 PID
podrá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 ss
para mostrar todos los sockets Unix.
ss -x
-x
Mostrar sockets de dominio Unix-e
Mostrar información detallada del socket-m
Mostrar uso de memoria del socket
y puedes filtrar por algún tipo:
ss -x -A unix_stream