Oui, vous pouvez le faire. Tout ce dont vous avez besoin est systemtap.
Considérez l'un des exemples de scripts systemtap qui imprimera le PID et le nom du processus de tout programme qui lit ou écrit un inode spécifié (et votre socket de domaine Unix en est une).
Vous pouvez trivialement modifier ce script pour imprimer les données réelles en cours de lecture/écriture ; Je vais laisser faire cela comme un exercice pour le lecteur.
Les réponses courtes sont non et pas facilement.
Sous Linux, lsof s'appuie sur /proc/net/unix
pour récupérer les informations concernant les sockets de domaine UNIX. Cette interface répertorie tous les sockets liés, mais pas suivre les terminaux. Ainsi, vous pouvez voyez quelles prises existent, mais vous ne pouvez pas voir ce qui y est connecté. Quelque part cette information se trouve suivi, il doit être suivi, sinon les connexions des sockets ne fonctionneraient pas. Je n'ai pas encore trouvé de mécanisme pour récupérer les informations de connexion.
La question du reniflement est légèrement plus intéressante, mais non moins décevante. Ce que je voulais dire par "pas facilement", c'est qu'il n'existe aucun crochet pour se faufiler et saisir ces données. L'analogue le plus proche utilise tcpdump ou Wireshark, qui utilisent tous deux libpcap pour faire le gros du travail. Alors que le réseau (AF_INET) et le domaine UNIX (AF_UNIX) sont tous deux créés à l'aide du socket()
appel de fonction, les deux utilisent connect()
pour se connecter, les deux utilisent read()
et write()
pour traiter les données, elles sont gérées par différents sous-systèmes du noyau. Cela a l'effet secondaire malheureux que libpcap n'est pas conçu pour fonctionner avec les sockets de domaine UNIX.
Il y a un côté un peu moins sombre au problème. Jetez un oeil à la page de manuel pour recv(2)
. Il s'agit d'un appel système de niveau inférieur qui read()
fait usage de. Il existe un drapeau pour recv()
appelé MSG_PEEK
. Cela vous permettrait de renifler le trafic passant par un socket de domaine UNIX. C'est donc le bon côté, le côté obscur est qu'à ma connaissance, il n'existe aucune application actuelle conçue pour faire cela. Vous envisagez donc un effort de développement.
J'aimerais vraiment qu'il y ait une belle réponse simple de F'YEAH aux deux parties de votre question.
Je sais que cela ne répond pas à la question principale, mais je me suis retrouvé ici, cherchant simplement à renifler la communication sur une prise. J'ai décidé de publier pour d'autres comme moi. Voici comment j'ai procédé :
$> sudo socat -t100 -x -v UNIX-LISTEN :/var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT :/var/run/php5-fpm.sock
Vous pouvez supprimer -x et laisser -v pour la communication ascii. J'espère que cela aidera quelqu'un.