Como posso saber o nome do processo que está abrindo uma porta tcp?

5

Eu tenho dois servidores linux. Digamos que eles sejam C e S .
C é cliente de S

Na minha máquina S , eu digito.

$ netstat -an | grep ESTABLISHED
tcp 0 0 192.168.1.220:3306 C:57010 ESTABLISHED

Então, posso saber que C está se conectando agora.
Na máquina C , eu também gostaria de saber o nome do processo que está abrindo a porta 57010 e conectando o servidor S . Como eu posso fazer isso? Claro que tenho permissão root de C .

    
por Benjamin 26.07.2012 / 09:12

3 respostas

9

Uma maneira é dizer lsof -i:57010 -sTCP:ESTABLISHED . Isso anda na tabela de identificadores de arquivos abertos do kernel procurando por processos com uma conexão TCP estabelecida usando essa porta. (Soquetes de rede são identificadores de arquivo em sistemas do tipo * ix.) Você usaria -sTCP:LISTEN no lado do servidor para filtrar apenas o soquete do ouvinte.

Devido à maneira como o lsof funciona, ele só pode ver os processos que seu usuário possui, a menos que você o execute como root. Também é bastante ineficiente, já que um sistema típico * ix tem um lote de identificadores de arquivos abertos a qualquer momento. O método netstat dado em outra resposta é mais rápido e geralmente tem menos requisitos de acesso.

O método lsof tem uma grande vantagem, no entanto: nem todos os SOs do tipo * ix possuem um sinal netstat para incluir o nome do processo na saída, enquanto lsof foi portado para todos os SOs do tipo * ix que você provavelmente usará . O netstat do OS X é assim, por exemplo. Ele tem uma opção -p , mas faz algo diferente de netstat -p no Linux.

Para um número de porta incomum como o da sua pergunta, normalmente você pode sair sem adicionar lsof ' -s flag, porque é improvável que uma determinada máquina tenha programas conectando-se à porta e ouvindo nela . Pode ser útil adicioná-lo com números de porta como o 80 do HTTP, onde é provável que você tenha vários programas usando essa porta de uma só vez.

É uma sorte que o sinal -s seja opcional em muitas situações, porque esse uso só funciona com lsof versão 4.81 e mais recente. Em versões mais antigas, -s significava algo completamente diferente! Essa é uma mudança vintage de 2008, mas ainda pode morder inesperadamente. O RHEL 5 é fornecido com lsof 4.78, por exemplo.

    
por 26.07.2012 / 12:57
8

Você pode usar netstat -anp | grep 57010 no servidor C . Mas isso só funcionará se não houver nenhum firewall entre o que está mapeando a porta 57010 para outra diferente.

    
por 26.07.2012 / 09:28
5

Apenas por uma questão de integridade:

Usando ss do novo conjunto de ferramentas do utilitário de rede do Linux ( iproute2 ):

ss -tp sport = :57010 dst 192.168.1.220
    
por 19.10.2012 / 15:26