Come posso saperne di più sui file socket in / proc / fd?


33

Guardando in / proc / $ mypid / fd /, vedo questi file

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]

Poiché ho accesso al codice, so che questi socket sono collegati alle connessioni TCP (una è una connessione alla porta 5672 su una macchina, un'altra è una connessione alla porta 3306 su un'altra macchina), ma voglio sapere quale socket è legato a quale connessione. Come lo posso fare?

Più in generale, come posso chiedere al sistema operativo cosa si trova all'altra estremità del socket?


1
Usa socat....
heemayl

Risposte:


40

Comando lsof

Una buona opzione potrebbe essere lsof. Come man lsofindicato è utile per ottenere informazioni su open files such as Internet sockets or Unix Domain sockets.


Usandolo

Inizialmente, ottieni una panoramica /proc/$PID/fd/dei numeri di socket elencati.
Ad esempio, socket:[14240]potrebbe interessarti.

Quindi utilizzare lsof -i -a -p $PIDper stampare un elenco di tutti gli $PIDusi dei file di rete .

  • -i produce un elenco di file di rete appartenenti a un utente o processo

  • -a combina logicamente o i parametri forniti da AND

  • -p $PID seleziona le informazioni solo sulla tua procedura

Un output tipico per il mio browser in esecuzione con un PID di 2543potrebbe essere:

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)

e linee più simili.

Grande! Ora dai un'occhiata più da vicino alla DEVICEcolonna. Corrisponde al nostro socket precedentemente elencato da /proc/$PID/fd/!
E grazie alla NAMEsezione possiamo dire qual è l'altra estremità del nostro socket.

In un mondo reale potresti ottenere una buona quantità di output, ma solo un filtro o grepper il tuo socket di interesse.

Sono abbastanza sicuro che uno potrebbe combinare tutti i comandi, ma dovrebbe essere sufficiente per iniziare.


Grazie! Votato e accettato. Vedo un socket visualizzato in lsof come "unix 0xffff88002704d380 0t0 1423733559 socket", come posso scavare in ciò che è 0xffff88002704d380?
benhsu,

1
"unix 0xfff ..." sembra l'indirizzo di memoria del kernel di una struttura unix_sock. Questa struttura contiene un puntatore al punto di fine socket. Dai un'occhiata grep -rni ffff88002704d380 /proc. da qualche parte sotto / proc / potrebbe trovarsi la tua risposta, il cattuo file grep trovato. Ma non mi appuntare su questo ... Potrebbe essere orribile sbagliato qui.
pidi,

lsoflegge altre informazioni sul socket da /proc/net/tcp, /proc/net/tcp6, /proc/net/udpe così via a seconda del tipo di socket.
Jesin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.