Como descubro mais sobre arquivos de soquete em / proc / fd?

33

Procurando em / proc / $ mypid / fd /, vejo esses arquivos

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]

Como tenho acesso ao código, sei que esses soquetes estão vinculados às conexões TCP (uma é uma conexão à porta 5672 em alguma máquina, outra é uma conexão à porta 3306 em outra máquina), mas quero saber qual soquete está vinculado a qual conexão. Como eu posso fazer isso?

De maneira mais geral, como posso perguntar ao sistema operacional o que há na outra extremidade do soquete?

benhsu
fonte
1
Use socat....
heemayl
Veja também Quem tem a outra ponta desse soquete unix?
Gilles 'SO- stop be evil'

Respostas:

40

Comando lsof

Uma boa opção pode ser lsof. Como man lsofafirma, é útil para obter informações sobre open files such as Internet sockets or Unix Domain sockets.


Usando isso

Inicialmente, obtenha uma visão geral sobre /proc/$PID/fd/e os números de soquete listados.
Por exemplo, socket:[14240]pode lhe interessar.

Em seguida, use lsof -i -a -p $PIDpara imprimir uma lista de todos os arquivos de rede $PIDusados.

  • -i produz uma lista de arquivos de rede pertencentes a um usuário ou processo

  • -a combina logicamente ou os parâmetros dados de AND

  • -p $PID seleciona informações apenas sobre seu processo

Uma saída típica para o meu navegador executando com um PID de 2543pode ser:

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)

e linhas mais semelhantes.

Ótimo! Agora dê uma olhada mais de perto na DEVICEcoluna. Corresponde ao nosso soquete listado anteriormente /proc/$PID/fd/!
E, graças à NAMEseção, podemos dizer qual é a outra extremidade do nosso soquete.

Em uma execução no mundo real, você pode obter uma boa quantidade de saída, mas apenas filtre ou atenda grepao seu interesse.

Tenho certeza de que é possível combinar todos os comandos, mas isso deve ser suficiente para você começar.

pidi
fonte
Obrigado! Votado e aceito. Eu vejo um soquete aparecendo em lsof como "soquete 0xffff88002704d380 0t0 1423733559", como faço para descobrir o que é 0xffff88002704d380?
benhsu
1
"unix 0xfff ..." parece o endereço de memória do kernel de uma estrutura unix_sock. Essa estrutura contém um ponteiro para o ponto final do soquete. Dê uma olhada grep -rni ffff88002704d380 /proc. em algum lugar em / proc / pode estar sua resposta, catseu grep de arquivo foi encontrado. Mas não me prenda a isso ... Pode estar horrível errado aqui.
Pidi
lsoflê outras informações sobre a tomada de /proc/net/tcp, /proc/net/tcp6, /proc/net/udpe assim por diante, dependendo do tipo soquete.
Jesin