Comment en savoir plus sur les fichiers socket dans / proc / fd?

33

En regardant dans / proc / $ mypid / fd /, je vois ces fichiers

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]

Parce que j'ai accès au code, je sais que ces sockets sont liées à des connexions TCP (l'une est une connexion au port 5672 sur une machine, une autre est une connexion au port 3306 sur une autre machine), mais je veux savoir quelle est la socket lié à quelle connexion. Comment puis je faire ça?

Plus généralement, comment demander au système d'exploitation ce qui se trouve à l'autre extrémité du socket?

benhsu
la source
1
Utilisez socat....
heemayl
Voir aussi Qui a l'autre extrémité de cette paire de sockets unix?
Gilles 'SO- arrête d'être méchant'

Réponses:

40

Commande lsof

Une bonne option pourrait être lsof. Comme man lsofindiqué, il est pratique pour obtenir des informations sur open files such as Internet sockets or Unix Domain sockets.


En l'utilisant

Dans un premier temps, obtenez un aperçu /proc/$PID/fd/et les numéros de socket répertoriés.
Par exemple, cela socket:[14240]pourrait vous intéresser.

Utilisez ensuite lsof -i -a -p $PIDpour imprimer une liste de tous les fichiers réseau $PIDutilisés.

  • -i produit une liste de fichiers réseau appartenant à un utilisateur ou à un processus

  • -a combine logiquement les paramètres donnés par AND

  • -p $PID sélectionne des informations uniquement sur votre processus

Une sortie typique pour mon navigateur fonctionnant avec un PID de 2543pourrait être:

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)

et des lignes plus similaires.

Génial! Examinez maintenant de plus près la DEVICEcolonne. Il correspond à notre socket précédemment répertorié de /proc/$PID/fd/!
Et grâce à la NAMEsection, nous pouvons dire quelle est l'autre extrémité de notre socket.

Dans une course réelle, vous pouvez obtenir une bonne quantité de sortie, mais simplement filtrer ou greppour votre socket d'intérêt.

Je suis sûr que l'on pourrait combiner toutes les commandes, mais cela devrait suffire pour vous aider à démarrer.

pidi
la source
Merci! Surévalué et accepté. Je vois un socket apparaître dans lsof comme "socket unix 0xffff88002704d380 0t0 1423733559", comment puis-je creuser dans ce qu'est 0xffff88002704d380?
benhsu
1
"unix 0xfff ..." ressemble à l'adresse mémoire du noyau d'une structure unix_sock. Cette structure contient un pointeur sur votre point d'extrémité de socket. Jetez un oeil à grep -rni ffff88002704d380 /proc. quelque part sous / proc / peut se trouver votre réponse, catvotre fichier grep a été trouvé. Mais ne m'arrêtez pas là-dessus ... Ça peut être horrible de mal ici.
pidi
lsoflit d' autres informations concernant la prise de /proc/net/tcp, /proc/net/tcp6, /proc/net/udp, et ainsi de suite en fonction du type de prise de courant.
Jesin