Quem está ouvindo em uma determinada porta TCP no Mac OS X?

1382

No Linux, posso usar netstat -pntl | grep $PORTou fuser -n tcp $PORTdescobrir qual processo (PID) está escutando na porta TCP especificada. Como obtenho as mesmas informações no Mac OS X?

pts
fonte
27
Desculpe, netstat -p tcp | grep $PORTnão exibe PIDs, pois o netstat no Mac OS X não pode exibir PIDs.
pts
12
netstat -anvExibe a porta no Mac OS X (fonte: solução abaixo por @SeanHamiliton)
Curtis Yallop

Respostas:

2049

No macOS High Sierra e posterior, use este comando:

lsof -nP -iTCP:$PORT | grep LISTEN

ou apenas para ver apenas IPv4:

lsof -nP -i4TCP:$PORT | grep LISTEN

Nas versões mais antigas, use um dos seguintes formulários:

lsof -nP -iTCP:$PORT | grep LISTEN
lsof -nP -i:$PORT | grep LISTEN

Substitua $PORTpelo número da porta ou por uma lista de números de porta separados por vírgula.

Anexe antes sudo(seguido de um espaço) se precisar de informações sobre portas abaixo do # 1024.

O -nsinalizador é para exibir endereços IP em vez de nomes de host. Isso faz com que o comando seja executado muito mais rápido, porque as pesquisas de DNS para obter os nomes de host podem ser lentas (vários segundos ou um minuto para muitos hosts).

A -Pbandeira é para a exibição de números brutos de porta em vez de nomes resolvidos como http, ftpou nomes de serviços mais esotéricos como dpserve, socalia.

Veja os comentários para mais opções.

Para ser completo, porque frequentemente usados ​​juntos:

Para matar o PID:

kill -9 <PID>
# kill -9 60401
pts
fonte
154
Prefixe isso com sudopara ver processos que você não possui.
Gordon Davisson
30
no leão, trabalhou com uma mudançasudo lsof -i TCP:$PORT | grep LISTEN
dhaval
58
Em Mountain Lion, você não precisa grep:sudo lsof -iTCP:$PORT -sTCP:LISTEN
Siu Ching Pong -Asuka Kenji-
16
depois de tantas pesquisas, essa é a melhor. as pessoas que desejam copiar diretamente o comando devem substituir $ PORT pelo número da porta real ou definir a variável PORT e também para várias portas como: export PORT = 8080,4433; lsof -n -i4TCP: $ PORT
siddhusingh
2
Um não precisa de sudo se a porta para investigar é acima de 1024.
stigkj
626

Desde o Snow Leopard (10.6), até o Mojave (10.14) e Catalina (10,15) , todas as versões do macOS suportam isso:

sudo lsof -iTCP -sTCP:LISTEN -n -P

Pessoalmente, acabei com esta função simples no meu ~/.bash_profile:

listening() {
    if [ $# -eq 0 ]; then
        sudo lsof -iTCP -sTCP:LISTEN -n -P
    elif [ $# -eq 1 ]; then
        sudo lsof -iTCP -sTCP:LISTEN -n -P | grep -i --color $1
    else
        echo "Usage: listening [pattern]"
    fi
}

O listeningcomando Then fornece uma lista de processos que estão ouvindo em alguma porta e a listening smthcumprimenta por algum padrão.

Tendo isso, é muito fácil perguntar sobre um processo específico, por exemplo listening dropbox, ou porta, por exemplo listening 22.

lsofO comando tem algumas opções especializadas para perguntar sobre porta, protocolo, processo etc. mas, pessoalmente, achei as funções acima muito mais úteis, pois não preciso me lembrar de todas essas opções de baixo nível. lsofé uma ferramenta bastante poderosa, mas infelizmente não é tão confortável de usar.

Michał Kalinowski
fonte
7
Isso está acontecendo nos meus arquivos de ponto. Eu procuro a cada poucos meses e sempre encontro essa resposta.
Danemacmillan
1
Eu acho que essa resposta deve ser aceita, como o OP disse -pntl, o que listaria todos os serviços. A resposta aceita solicita que um ou mais números de porta sejam especificados, o que não é remotamente o mesmo.
seeafish
440

Você também pode usar:

sudo lsof -i -n -P | grep TCP

Isso funciona no Mavericks.

Rog182
fonte
3
A -iopção torna significativamente mais rápido. 0,02 segundos vs 2 segundos. Na minha aplicação, isso fez a diferença.
Eric Boehs
o que esses sinalizadores específicos fazem -i, -n, -P. Não consigo encontrar em qualquer lugar que eles querem dizer exatamente
Chad Watkins
sudo lsof -i -n -P | TCP grep | grep $ PORT -
Criei
Eu sugeriria adicionar "| grep $ PORT" ou "| grep LISTEN"
KC Baltz
Ótimo! Funciona também no Mojave.
Gefilte Fish
291

Atualização de janeiro de 2016

Realmente surpreso, ninguém sugeriu:

lsof -i :PORT_NUMBER

para obter as informações básicas necessárias. Por exemplo, verificando na porta 1337:

lsof -i :1337

Outras variações, dependendo das circunstâncias:

sudo lsof -i :1337
lsof -i tcp:1337

Você pode facilmente criar isso para extrair o próprio PID. Por exemplo:

lsof -t -i :1337

que também é equivalente (no resultado) a este comando:

lsof -i :1337 | awk '{ print $2; }' | head -n 2 | grep -v PID

Ilustração rápida:

insira a descrição da imagem aqui

Para ser completo, porque frequentemente usados ​​juntos:

Para matar o PID:

kill -9 <PID>
# kill -9 60401

ou como um forro:

kill -9 $(lsof -t -i :1337)
arcseldon
fonte
2
Este comando também exibe PIDs que não são do ouvinte e as perguntas explicitamente solicitadas apenas para ouvintes.
pts
3
Você também pode executar lsof -t -i :1338. -tretornará a identificação do processo, assim você não terá que despertar / cabeça.
KFunk
Nada funcionou, exceto kill -9 $(lsof -t -i :5000)em el capitan
Goksel
Isso é ótimo. Eu prefiro saber o que está lá antes de matá-lo, então (baseado neste) Eu só acrescentou ao meu bashrc: whatsonport() { ps -ef | grep `lsof -t -i :$1` }, então:⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node .
Sigfried
1
Obrigado, lsof -i :PORT_NUMBERfez um trabalho para mim.
marika.daboja
79

Isso funciona no Mavericks (OSX 10.9.2).

sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN
Charley Wu
fonte
Eu não precisava do sudo na 10.10.
Sophistifunk
Trabalhou Yosemite (10.10.2)
Phillip Kamikaze
48

Para as portas LISTEN, ESTABELECIDAS e FECHADAS

sudo lsof -n -i -P | grep TCP

Apenas para as portas LISTEN

sudo lsof -n -i -P | grep LISTEN

Para uma porta LISTEN específica, por exemplo: porta 80

sudo lsof -n -i -P | grep ':80 (LISTEN)'

Ou se você quiser apenas um resumo compacto [nenhum serviço / aplicativo descrito], vá em NETSTAT. O lado bom aqui é que não é necessário sudo

netstat -a -n | grep 'LISTEN '

Explicando os itens usados:

-n suprime o nome do host

-i para protocolos IPv4 e IPv6

-P omite nomes de porta

-a [over netstat] para todos os soquetes

-n [over netstat] não resolve nomes, mostra endereços de rede como números

Testado em High Sierra 10.13.3 e Mojave 10.14.3

  • a última sintaxe netstat também funciona no linux
PYK
fonte
As explicações detalhadas são realmente muito úteis para iniciantes como eu. Obrigado @PYK
Tomaz Wang
46

no OS X, você pode usar a opção -v para o netstat para fornecer o pid associado.

tipo:

netstat -anv | grep [.]PORT

a saída ficará assim:

tcp46      0      0  *.8080                 *.*                    LISTEN      131072 131072   3105      0

O PID é o número antes da última coluna, 3105 para este caso

Sean Hamilton
fonte
Você também precisa adicionar grep LISTENpara mostrar apenas os ouvintes.
pts
3
Era disso que eu precisava! lsofNão foi possível encontrar a porta. mas netstatmostrou que estava aberto. -vfoi o molho secreto que me faltava.
Aaron McMillin 29/11
32

No macOS, eis uma maneira fácil de obter o ID do processo que está escutando em uma porta específica com o netstat . Este exemplo procura um processo que serve conteúdo na porta 80:

encontre o servidor em execução na porta 80

netstat -anv | egrep -w [.]80.*LISTEN

saída de amostra

tcp4  0 0  *.80       *.*    LISTEN      131072 131072    715      0

O segundo da última coluna é o PID. Acima, são 715 .

opções

-a - mostra todas as portas, incluindo aquelas usadas pelos servidores

-n- mostre números, não procure nomes. Isso torna o comando muito mais rápido

-v - saída detalhada, para obter os IDs do processo

-w- procure palavras. Caso contrário, o comando retornará informações para as portas 8000 e 8001, não apenas "80"

LISTEN - forneça informações apenas para portas no modo LISTEN, ou seja, servidores

johntellsall
fonte
2
o sinalizador -v tornou
user9869932
18

Na versão mais recente do macOS, você pode usar este comando:

lsof -nP -i4TCP:$PORT | grep LISTEN

Se você acha difícil lembrar, talvez crie uma bashfunção e exporte-a com um nome mais amigável como esse

vi ~/.bash_profile

e adicione as seguintes linhas a esse arquivo e salve-o.

function listening_on() {
    lsof -nP -i4TCP:"$1" | grep LISTEN
}

Agora você pode digitar listening_on 80seu terminal e ver qual processo está escutando na porta 80.

arturgrigor
fonte
13

No Snow Leopard (OS X 10.6.8), a execução de 'man lsof' gera:

lsof -i 4 -a

(a entrada manual real é 'lsof -i 4 -a -p 1234')

As respostas anteriores não funcionaram no Snow Leopard, mas eu estava tentando usar 'netstat -nlp' até ver o uso de 'lsof' na resposta por pts.

Brent Self
fonte
10

Eu sou um cara do Linux. No Linux, é extremamente fácil com netstat -ltpnou qualquer combinação dessas letras. Mas no Mac OS X netstat -an | grep LISTENé o mais humano. Outros são muito feios e muito difíceis de lembrar ao solucionar problemas.

edib
fonte
2
A pergunta solicitou explicitamente uma porta TCP específica e seus comandos mostram ouvintes em todas as portas.
pts
7
lsof -n -i | awk '{ print $1,$9; }' | sort -u

Isso mostra quem está fazendo o quê. Remova -n para ver os nomes de host (um pouco mais lento).

Misha Tavkhelidze
fonte
1
Sua resposta não é ruim, mas está em uma pergunta com várias respostas altamente votadas e aceita, de vários anos atrás. No futuro, tente se concentrar em perguntas mais recentes, especialmente aquelas que ainda não foram respondidas.
Este comando exibe portas não TCP também e não ouvintes também? A pergunta solicita explicitamente ouvintes apenas nas portas TCP.
pts
De acordo com a página do manual lsof (8): If no address is specified, this option [-i] selects the listing of all Internet and x.25 (HP-UX) network files.
Misha Tavkhelidze
@Misha Tavkhelidze: Por isso, também exibe os não ouvintes, por isso não responde à pergunta.
pts
Adicionar -sTCP:LISTENalsof
Misha Tavkhelidze
3

Isso fez o que eu precisava.

ps -eaf | grep `lsof -t -i:$PORT`
Frank
fonte
1

Fiz um pequeno roteiro para ver não apenas quem está ouvindo onde, mas também exibir conexões estabelecidas e com quais países. Funciona no OSX Siera

#!/bin/bash
printf "\nchecking established connections\n\n"
for i in $(sudo lsof -i -n -P | grep TCP | grep ESTABLISHED | grep -v IPv6 | 
grep -v 127.0.0.1 | cut -d ">" -f2 | cut -d " " -f1 | cut -d ":" -f1); do
    printf "$i : " & curl freegeoip.net/xml/$i -s -S | grep CountryName | 
cut -d ">" -f2 | cut -d"<" -f1
done

printf "\ndisplaying listening ports\n\n"

sudo lsof -i -n -P | grep TCP | grep LISTEN | cut -d " " -f 1,32-35

#EOF

Sample output
checking established connections

107.178.244.155 : United States
17.188.136.186 : United States
17.252.76.19 : United States
17.252.76.19 : United States
17.188.136.186 : United States
5.45.62.118 : Netherlands
40.101.42.66 : Ireland
151.101.1.69 : United States
173.194.69.188 : United States
104.25.170.11 : United States
5.45.62.49 : Netherlands
198.252.206.25 : United States
151.101.1.69 : United States
34.198.53.220 : United States
198.252.206.25 : United States
151.101.129.69 : United States
91.225.248.133 : Ireland
216.58.212.234 : United States

displaying listening ports

mysqld TCP *:3306 (LISTEN)
com.avast TCP 127.0.0.1:12080 (LISTEN)
com.avast TCP [::1]:12080 (LISTEN)
com.avast TCP 127.0.0.1:12110 (LISTEN)
com.avast TCP [::1]:12110 (LISTEN)
com.avast TCP 127.0.0.1:12143 (LISTEN)
com.avast TCP [::1]:12143 (LISTEN)
com.avast TCP 127.0.0.1:12995 (LISTEN)
com.avast [::1]:12995 (LISTEN)
com.avast 127.0.0.1:12993 (LISTEN)
com.avast [::1]:12993 (LISTEN)
Google TCP 127.0.0.1:34013 (LISTEN)

Isso pode ser útil para verificar se você está conectado à Coréia do Norte! ;-)

0x00
fonte
0

Esta é uma boa maneira no macOS High Sierra:

netstat -an |grep -i listen
tr4nc3
fonte
Isso mesmo! A resposta aceita é realmente o caminho certo ... O netstat no mac os x não mostra o pid para o mapeamento de portas.
tr4nc3
0

Inspirado pelo usuário Brent Self:

lsof -i 4 -a | grep LISTEN

Punnerud
fonte
0

Para o macOS, uso dois comandos juntos para mostrar informações sobre os processos que estão ouvindo na máquina e sobre o processo de conexão com servidores remotos. Em outras palavras, para verificar as portas de atendimento e as conexões atuais (TCP) em um host, você pode usar os dois comandos a seguir juntos

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

Pensei em acrescentar minha opinião, espero que possa acabar ajudando alguém.

Boschko
fonte