Si, puoi fare questo. Tutto ciò di cui hai bisogno è systemtap.
Considera uno degli script systemtap di esempio che stamperà il PID e il nome del processo di qualsiasi programma che legge o scrive un inode specificato (e il tuo socket di dominio Unix è proprio una cosa del genere).
Puoi banalmente modificare questo script per stampare i dati effettivi che vengono letti/scritti; Lascerò fare questo come esercizio al lettore.
Le risposte brevi sono no e non facilmente.
Su Linux lsof si basa su /proc/net/unix
per recuperare le informazioni relative ai socket di dominio UNIX. Questa interfaccia elenca tutti i socket associati, ma non tenere traccia degli endpoint. Quindi puoi guarda quali prese esistono, ma non puoi vedere cosa è collegato a loro. Da qualche parte questa informazione è tracciato, deve essere tracciato altrimenti le connessioni socket non funzionerebbero. Devo ancora trovare un meccanismo per recuperare le informazioni di connessione.
La domanda annusata è leggermente più interessante, ma non per questo meno deludente. Quello che intendevo con "non facilmente" è che non esiste alcun gancio per intrufolarsi e afferrare quei dati. L'analogo più vicino sta usando tcpdump o Wireshark, entrambi usano libpcap per fare effettivamente il lavoro pesante. Mentre la rete (AF_INET) e il dominio UNIX (AF_UNIX) vengono entrambi creati utilizzando il socket()
chiamata di funzione, entrambi usano connect()
a cui connettersi, entrambi usano read()
e write()
per elaborare i dati, sono gestiti da diversi sottosistemi del kernel. Ciò ha lo sfortunato effetto collaterale che libpcap non è progettato per funzionare con socket di dominio UNIX.
C'è un lato leggermente meno oscuro del problema. Dai un'occhiata alla pagina man di recv(2)
. Questa è una chiamata di sistema di livello inferiore read()
fare uso di. Esiste un flag per recv()
chiamato MSG_PEEK
. Ciò consentirebbe di sniffare il traffico che passa attraverso un socket di dominio UNIX. Quindi questo è il lato positivo, il lato oscuro è che, per quanto ne so, non esiste alcuna applicazione corrente progettata per farlo. Quindi stai cercando uno sforzo di sviluppo.
Vorrei davvero che ci fosse una bella risposta semplice di F'YEAH a entrambe le parti della tua domanda.
So che questo non sta rispondendo alla domanda principale, ma sono finito qui, cercando solo comunicazioni fiutate su un socket. Ho deciso di postare per altri come me. Ecco come l'ho fatto:
$> sudo socat -t100 -x -v UNIX-LISTEN:/var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT:/var/run/php5-fpm.sock
Puoi rimuovere -x e lasciare solo -v per la comunicazione ascii. Spero che questo aiuti qualcuno.