GNU/Linux >> Linux Esercitazione >  >> Linux

Come trovare l'altra estremità della connessione socket unix?

Soluzione 1:

Questa risposta è solo per Linux.

Aggiornamento per Linux 3.3: Come ha scritto Zulakis in una risposta separata (+1 quello), puoi usare ss da iproute2 per ottenere una coppia di numeri di inode per ogni connessione socket che identifica l'estremità locale e il peer. Questo sembra essere basato sullo stesso meccanismo di sock_diag(7) con UNIX_DIAG_PEER attributo che identifica il peer. Una risposta di Totor su Unix &Linux Stack Exchange si collega ai relativi commit in kernel e iproute2 e menziona anche la necessità del UNIX_DIAG impostazione di configurazione del kernel.

Segue la risposta originale per Linux precedente alla 3.3.

Sulla base di una risposta da Unix &Linux Stack Exchange, ho identificato con successo l'altra estremità di un socket di dominio unix utilizzando strutture di dati interne al kernel, a cui si accede utilizzando gdb e /proc/kcore . Devi abilitare il CONFIG_DEBUG_INFO e CONFIG_PROC_KCORE opzioni del kernel.

Puoi usare lsof per ottenere l'indirizzo del kernel del socket, che assume la forma di un puntatore, ad es. 0xffff8803e256d9c0 . Quel numero è in realtà l'indirizzo della relativa struttura di memoria nel kernel o digitare struct unix_sock . Quella struttura ha un campo chiamato peer che punta all'altra estremità della presa. Quindi i comandi

# gdb /usr/src/linux/vmlinux /proc/kcore
(gdb) p ((struct unix_sock*)0xffff8803e256d9c0)->peer

stamperà l'indirizzo dell'altra estremità della connessione. Puoi grep l'output di lsof -U per quel numero per identificare il processo e il numero del descrittore di file di quell'altra estremità.

Alcune distribuzioni sembrano fornire i simboli di debug del kernel come un pacchetto separato, che prenderebbe il posto del vmlinux file nel comando precedente.

Soluzione 2:

Di recente mi sono imbattuto in un problema simile. Sono rimasto scioccato nello scoprire che ci sono casi in cui questo potrebbe non essere possibile. Ho recuperato un commento dal creatore di lsof (Vic Abell) in cui ha sottolineato che questo dipende fortemente dall'implementazione del socket unix. A volte sono disponibili le cosiddette informazioni "endpoint" per il socket e talvolta no. Purtroppo è impossibile in Linux, come sottolinea.

Su Linux, ad esempio, dove lsof mustuse /proc/net/unix, tutti i socket di dominio UNIX hanno un percorso associato, ma nessuna informazione sull'endpoint. Spesso non esiste un percorso vincolato. Ciò spesso rende impossibile determinare l'altro endpoint, ma è il risultato dell'implementazione del file system Linux /proc.

Se guardi /proc/net/unix puoi vedere di persona che (almeno sul mio sistema) ha assolutamente ragione. Sono ancora scioccato, perché trovo questa funzionalità essenziale durante il monitoraggio dei problemi del server.

Soluzione 3:

In realtà, ss da iproute2 (in sostituzione di netstat, ifconfig, ecc.) può mostrare queste informazioni.

Ecco un esempio che mostra un socket di dominio unix ssh-agent a cui un ssh il processo si è connesso:

$ sudo ss -a --unix -p
Netid  State      Recv-Q Send-Q Local                             Address:Port          Peer    Address:Port
u_str  ESTAB      0      0      /tmp/ssh-XxnMh2MdLBxo/agent.27402 651026                *       651642                users:(("ssh-agent",pid=27403,fd=4)
u_str  ESTAB      0      0       *                                651642                *       651026                users:(("ssh",pid=2019,fd=4))

Soluzione 4:

Socket Unix solitamente vengono assegnati numeri in coppia e di solito sono consecutivi. Quindi la coppia per te sarebbe probabilmente 1013410+/-1. Guarda quale di questi due esiste e indovina il colpevole.

Soluzione 5:

Ho scritto uno strumento che utilizza il metodo gdb di MvG per ottenere in modo affidabile informazioni sui socket peer, i simboli di debug del kernel non sono necessari.

Per connettere il processo a un dato socket, passagli il numero di inode:

# socket_peer 1013410
3703 thunderbird 

Per scoprire tutti i processi contemporaneamente usa netstat_unix , aggiunge una colonna all'output di netstat:

# netstat_unix
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Peer PID/Program name  Path
unix  3      [ ]         STREAM     CONNECTED     6825     982/Xorg             1497/compiz            /tmp/.X11-unix/X0
unix  3      [ ]         STREAM     CONNECTED     6824     1497/compiz          982/Xorg                 
unix  3      [ ]         SEQPACKET  CONNECTED     207142   3770/chromium-brows  17783/UMA-Session-R       
unix  3      [ ]         STREAM     CONNECTED     204903   1523/pulseaudio      3703/thunderbird       
unix  3      [ ]         STREAM     CONNECTED     204902   3703/thunderbird     1523/pulseaudio           
unix  3      [ ]         STREAM     CONNECTED     204666   1523/pulseaudio      3703/thunderbird       
...

Prova netstat_unix --dump se hai bisogno di un output facile da analizzare.
Vedi https://github.com/lemonsqueeze/unix_sockets_peers per i dettagli.

Per informazioni, l'hack inode +1/-1 non è affidabile. Funziona la maggior parte delle volte ma fallirà o (peggio) restituirà il socket sbagliato se sei sfortunato.


Linux
  1. Chi ha l'altra estremità di questa coppia di socket Unix?

  2. Come trovare tutti i file di proprietà di un utente specifico in Unix/Linux?

  3. Come rimuovo una connessione socket CLOSE_WAIT

  4. Trova quale processo si trova all'altra estremità di un tubo

  5. Come determinare il tempo di connessione del socket su Linux

Come trovare file in Linux

Come scoprire se un pacchetto è installato o meno in Linux e Unix

Come trovare l'indirizzo IP in Linux

Come trovare il nome host in Linux

Come cambiare l'ascolto PHP-FPM su socket Unix

Come trovare file in Debian