Comment puis-je savoir quel programme se trouve à l'autre extrémité d'un socket local?
Un processus sur mon système Linux, strace me dit, est en train de parler sur un socket qui a descripteur de fichier 10. lsof me dit que c'est un socket unix avec inode 11085, et netstat plus me dit que inode 11085 un socket de flux, et qu'il est connecté.
Étant donné que ce processus n'a pas d'autres threads, il doit donc y avoir un autre processus sur le système qui est connecté à l'autre extrémité de ce socket. Comment puis-je savoir ce que c'est?
mise à Jour:
Il y a une certaine illumination de la lsof auteur ici. Essentiellement, il semble que Linux n'a tout simplement pas fournir cette information.
source d'informationauteur daf
Vous devez vous connecter pour publier un commentaire.
le dira. (À condition que le support n'est pas détenue par le noyau lui-même.)
Ne
netstat -p
aider ?De Man:
Comment à ce sujet:
grep 11085 /proc/net/unix
. En supposant qu'il existe un non-vide chemin présents sur la ligne avec l'inode qui vous intéresse,grep
pour ce chemin dans/proc/net/unix
pour trouver l'inode pour l'autre extrémité de la connexion, puis utilisez @efficientjelly de la méthode pour cartographier les autres inode d'unpid
.Un point clé ici est le fait que les deux sockets connectées auront chacun leur propre numéro d'inœud.
Ressemble si vous êtes vraiment désespéré, vous pouvez obtenir cette information directement à partir de la mémoire du noyau Linux à l'aide de quelques débogueur de noyau. Avec RHEL5 "crash" de l'outil:
vmlinux
de l'image (par exemple. installerkernel-debuginfo
tr /min, ou de l'extrait devmlinux
fichier rpm)crash /path/to/vmlinux
net -s 12345
les listes de tous les sockets pourPID
12345UNIX:STREAM
), et de noter sesSOCK
valeur:PID: 12345 TASK: e903d000 CPU: 0 COMMAND: "someapp"
FD SOCKET SOCK FAMILY:TYPE SOURCE-PORT DESTINATION-PORT
36 cadd0240 c8a64040 UNIX:STREAM
unix_sock struct
pour ce socketunix_sock.peer.name
est le nom de la structure de l'autre extrémité de la douillep *(*(*((struct unix_sock*)( (struct unix_sock*)0xc8a64040)->peer)).addr).name
Vraiment triste que cette information n'est pas directement exportées vers l'espace utilisateur.
J'ai observé que :
Inode de la
fd
qui a appeléconnect()
sur le côté client, est toujours exactement un plus grand que celui que vous avez de nouveau à partir de laaccept()
appel sur le côté serveur.Exemple de sortie de mon prog:
Le chemin d'accès ne s'affiche pas dans
/proc/net/unix
.YMMV et je n'ai pas étudié les mécanismes sous-jacents.
J'ai écrit un outil qui utilise le gdb méthode fiable pour obtenir la prise d'information entre pairs, noyau symboles de débogage ne sont pas nécessaires.
Pour obtenir le processus lié à une socket, le passer, le numéro d'inœud:
À découvrir pour tous les processus à la fois l'utilisation
netstat_unix
il ajoute une colonne à la commande netstat de sortie:Essayer
netstat_unix --dump
si vous avez besoin d'une sortie qui est facile à analyser.Voir https://github.com/lemonsqueeze/unix_sockets_peers pour plus de détails.
Pour info, le inode +1/-1 hack n'est pas fiable. Il fonctionne la plupart du temps, mais échouera ou (pire) de retour de la mauvaise prise si vous êtes hors de la chance.
Si pour quelque raison vous n'avez pas de chance avec les lsof et netstat options, vous pouvez également effectuer les opérations suivantes:
lsof | grep 11085lsof doivent être exécutées en tant que root.J'ai fait des expériences avec lsof sur mon système Linux, et
lsof -U
montre que tous les nombres dans la colonne de NŒUD sont uniques.