Como saber quais portas são ouvidas por determinados PID?

13

Tenho um PID de determinado processo que escuta algumas portas no meu OS X e preciso saber quais portas são ouvidas por esse processo. Como eu posso fazer isso?

Eu sei que posso usar lsofpara saber qual processo está escutando alguma porta, mas preciso executar uma operação inversa.

Obrigado.

UPD

O OS X usa utilitários BSD, então eu tenho BSD e netstatnão Linux netstat. O Linux netstattem -popção para mostrar PIDs, o BSD netstatusa -ppara especificar a porta e não tem opção para mostrar PID.

shau-kote
fonte
Você quer dizer que está tentando encontrar as portas em que um processo está ouvindo? netstatpode fazer isso por você. Você pode grepsobre o PID se você quiser filtrar a saída denetstat
Centimane
também o lsofuso não é apenas uma maneira. você pode fazer algo parecido lsof|grep ${PID}. que despeja tudo grosseiramente e grepseleciona as linhas com PID. Em uma chance, que poderia listar uma linha irrelevante, devido ao número PID erroneamente combinando algum outro valor, mas as chances são quase nulas
MelBurslan
@ Dave, sim, você me segue certo. Além disso, como posso ver, a versão BSD do netstatnão pode exibir PIDs.
shau-Kote
@MelBurslan não parece uma solução limpa. Além disso, não é rápido - leva algum tempo no meu MBP.
shau-Kote

Respostas:

13

Eu encontrei uma solução sozinha lendo profundamente man lsof. (Sim, RT * M ainda ajuda.) Obrigado @Gilles por apontar.

Aqui está a solução: lsof -aPi -p 555 (555 é o PID).

Explicação:

  1. -p especificar o número do PID;
  2. -i exibir apenas dispositivos de rede;
  3. -a para AND duas condições acima (caso contrário, elas serão ORed);
  4. -P para exibir números de porta (em vez disso, nomes de porta por padrão).

Além disso, pode-se usar lsof -aPi4 -p 555ou lsof -aPi6 -p 55para endereços IPv4 ou IP6 apenas de acordo.

Se a saída for analisada por outra -Fnopção de programa, pode ser útil. Com esta opção lsofirá produzir "saída para outro programa" em vez de saída formatada agradável. lsof -aPi4 -Fn -p 555irá produzir algo como isto:

p554
nlocalhost:4321

PS Tudo que eu testei no meu OS X El Capitan, mas como posso ver, também deve funcionar no Linux.

shau-kote
fonte
6

lsoffornece informações sobre arquivos abertos por processos, incluindo portas de rede. Está disponível em praticamente todos os sistemas unix, incluindo o OSX .

O Rosetta Stone para Unix não lista nenhuma outra ferramenta para "combinar o processo ao arquivo ou porta" no OSX.

Para listar processos ouvindo em uma porta TCP, você pode usar

lsof -iTCP -sTCP:LISTEN

lsof -iUDPlista os processos que têm um soquete UDP aberto. lsof -ilista todos os soquetes de rede abertos (clientes TCP, servidores TCP e outros protocolos IP).

Gilles 'SO- parar de ser mau'
fonte
0

se você quiser saber qual porta está escutando, use a opção -p do netstat. você precisa ser o superusuário:

$ sudo netstat -nlp | grep 80
tcp  0  0  0.0.0.0:80  0.0.0.0:*  LISTEN  125004/nginx

se você quiser saber mais sobre isso, tente este link

Vinood NK Maheshwari
fonte
É sobre o GNU netstat, eu tenho o OS X e, portanto, uso o BSD netstat. Ele usa -ppara especificar a porta TCP / IP, e não tem opção para exibir o PID.
shau-Kote
0

No FreeBSD, você pode usar sockstatpara esta informação. Não tenho certeza se o OS X possui sockstat, pois não tenho um Mac.

Por exemplo, para ver todas as conexões TCPv4:

sockstat -4

GROND
fonte
Alack, não há sockstatcomando no meu Mac. :(
shau-kote
0

Você pode concatenar o netstat com grep, awk e sed para mostrar portas com seus pids correspondentes no Linux e Cygwin:

$ netstat -ano | grep LISTENING | grep -v ‘\[::\]’ | sort -n | uniq -c | awk ‘ {print $3 “\t” $6}’ | sed ‘s/.*://’

Mais detalhes

Atelier Iris
fonte