¿Quién está escuchando en un puerto TCP dado en Mac OS X?

1382

En Linux, puedo usar netstat -pntl | grep $PORTo fuser -n tcp $PORTpara averiguar qué proceso (PID) está escuchando en el puerto TCP especificado. ¿Cómo obtengo la misma información en Mac OS X?

pts
fuente
27
Lo sentimos, netstat -p tcp | grep $PORTno muestra PID ya que netstat en Mac OS X no puede mostrar PID.
pts
12
netstat -anvmuestra el puerto en Mac OS X (fuente: solución a continuación por @SeanHamiliton)
Curtis Yallop

Respuestas:

2049

En macOS High Sierra y posterior, use este comando:

lsof -nP -iTCP:$PORT | grep LISTEN

o solo para ver solo IPv4:

lsof -nP -i4TCP:$PORT | grep LISTEN

En versiones anteriores, use uno de los siguientes formularios:

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

Sustituya $PORTcon el número de puerto o una lista separada por comas de números de puerto.

Anteponga sudo(seguido de un espacio) si necesita información sobre puertos inferiores al # 1024.

La -nbandera es para mostrar direcciones IP en lugar de nombres de host. Esto hace que el comando se ejecute mucho más rápido, porque las búsquedas de DNS para obtener los nombres de host pueden ser lentas (varios segundos o un minuto para muchos hosts).

El -Pindicador se utiliza para mostrar los números de puerto RAW en lugar de nombres resueltos como http, ftpo nombres de servicios más esotéricos como dpserve, socalia.

Vea los comentarios para más opciones.

Para completar, porque frecuentemente se usan juntos:

Para matar el PID:

kill -9 <PID>
# kill -9 60401
pts
fuente
154
Prefije esto con sudopara ver los procesos que no le pertenecen.
Gordon Davisson
30
en león, trabajó con un cambiosudo lsof -i TCP:$PORT | grep LISTEN
dhaval
58
En Mountain Lion, no necesitas grep:sudo lsof -iTCP:$PORT -sTCP:LISTEN
Siu Ching Pong -Asuka Kenji-
16
Después de tantas búsquedas, esta es la mejor. las personas que desean copiar directamente el comando deben reemplazar $ PORT con el número de puerto real o definir la variable PORT y eso también para múltiples puertos como: export PORT = 8080,4433; lsof -n -i4TCP: $ PORT
siddhusingh
2
Uno no necesita sudo si el puerto para investigar está por encima de 1024.
stigkj
626

Desde Snow Leopard (10.6), hasta Mojave (10.14) y Catalina (10,15) , cada versión de macOS admite esto:

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

Personalmente, terminé con esta función simple en mi ~/.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
}

Luego, el listeningcomando le brinda una lista de los procesos que escuchan en algún puerto y listening smthajusta esto para algún patrón.

Teniendo esto, es bastante fácil preguntar sobre un proceso particular, por ejemplo listening dropbox, o puerto, por ejemplo listening 22.

lsofEl comando tiene algunas opciones especializadas para preguntar sobre puerto, protocolo, proceso, etc. pero personalmente he encontrado que la función anterior es mucho más útil, ya que no necesito recordar todas estas opciones de bajo nivel. lsofes una herramienta bastante poderosa, pero desafortunadamente no es tan cómoda de usar.

Michał Kalinowski
fuente
77
Esto va en mis archivos de puntos. Busco cada pocos meses y siempre encuentro esta respuesta.
danemacmillan
1
Siento que esta respuesta debería aceptarse como OP dijo que lo hace -pntl, lo que enumeraría todos los servicios. La respuesta aceptada pide que se especifique uno o más números de puerto, que no es remotamente el mismo.
seeafish el
440

También puedes usar:

sudo lsof -i -n -P | grep TCP

Esto funciona en Mavericks.

Rog182
fuente
3
La -iopción lo hace significativamente más rápido. 0.02 segundos vs 2 segundos. En mi solicitud, esto marcó la diferencia.
Eric Boehs
¿Qué hacen esas banderas específicas? -i, -n, -P. No puedo encontrar en ninguna parte lo que significan exactamente
Chad Watkins
sudo lsof -i -n -P | grep TCP | grep $ PORT - Hice un alias con este comando
alyn000r
Sugeriría agregar "| grep $ PORT" o "| grep LISTEN"
KC Baltz
¡Excelente! Funciona también en Mojave.
Gefilte Fish
291

Actualización enero 2016

Realmente sorprendido, nadie ha sugerido:

lsof -i :PORT_NUMBER

para obtener la información básica requerida. Por ejemplo, comprobando en el puerto 1337:

lsof -i :1337

Otras variaciones, según las circunstancias:

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

Puede construir fácilmente sobre esto para extraer el PID en sí. Por ejemplo:

lsof -t -i :1337

que también es equivalente (en resultado) a este comando:

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

Ilustración rápida

ingrese la descripción de la imagen aquí

Para completar, porque frecuentemente se usan juntos:

Para matar el PID:

kill -9 <PID>
# kill -9 60401

o como un trazador de líneas:

kill -9 $(lsof -t -i :1337)
arcseldon
fuente
2
Este comando también muestra los PID que no escuchan, y las preguntas formuladas explícitamente solo para los oyentes.
pts
3
También puedes correr lsof -t -i :1338. -tdevolverá la identificación del proceso, por lo que no tendrá que awk / head.
KFunk
Nada funcionó excepto kill -9 $(lsof -t -i :5000)en el capitan
goksel
Esto es genial. Prefiero saber qué hay allí antes de matarlo, así que (basado en esto) acabo de agregar a mi bashrc:, whatsonport() { ps -ef | grep `lsof -t -i :$1` }entonces:⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node .
Sigfried
1
Gracias, lsof -i :PORT_NUMBERhizo un trabajo para mí.
marika.daboja
79

Esto funciona en Mavericks (OSX 10.9.2).

sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN
Charley Wu
fuente
No necesitaba sudo en 10.10.
Sophistifunk
Trabajó Yosemite (10.10.2)
Phillip Kamikaze
48

Para los puertos ESCUCHAR, ESTABLECIDO y CERRADO

sudo lsof -n -i -P | grep TCP

Solo para los puertos LISTEN

sudo lsof -n -i -P | grep LISTEN

Para un puerto LISTEN específico, por ejemplo: puerto 80

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

O si solo desea un resumen compacto [sin servicio / aplicaciones descritas], vaya a NETSTAT. El lado bueno aquí es que no se necesita sudo

netstat -a -n | grep 'LISTEN '

Explicando los artículos utilizados:

-n suprime el nombre de host

-i para protocolos IPv4 e IPv6

-P omita los nombres de puerto

-a [sobre netstat] para todos los enchufes

-norte [sobre netstat] no resuelve nombres, muestra las direcciones de red como números

Probado en High Sierra 10.13.3 y Mojave 10.14.3

  • la última sintaxis netstat también funciona en Linux
PYK
fuente
Las explicaciones detalladas son realmente muy útiles para principiantes como yo. gracias @PYK
Tomaz Wang
46

en OS X puede usar la opción -v para netstat para dar el pid asociado.

tipo:

netstat -anv | grep [.]PORT

la salida se verá así:

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

El PID es el número antes de la última columna, 3105 para este caso

Sean Hamilton
fuente
También debe agregar grep LISTENpara mostrar solo a los oyentes.
pts
3
¡Esto es lo que necesitaba! lsofNo pude encontrar el puerto. pero netstatmostró que estaba abierto. -vfue la salsa secreta que me faltaba.
Aaron McMillin
32

En macOS, aquí hay una manera fácil de obtener la ID del proceso que está escuchando en un puerto específico con netstat . Este ejemplo busca un proceso que sirve contenido en el puerto 80:

encontrar el servidor que se ejecuta en el puerto 80

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

salida de muestra

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

El segundo de la última columna es el PID. En lo anterior, es 715 .

opciones

-a - muestra todos los puertos, incluidos los utilizados por los servidores

-n- Mostrar números, no buscar nombres. Esto hace que el comando sea mucho más rápido

-v - salida detallada, para obtener las ID de proceso

-w- palabras de búsqueda. De lo contrario, el comando devolverá información para los puertos 8000 y 8001, no solo "80"

LISTEN - proporcione información solo para puertos en modo ESCUCHAR, es decir, servidores

johntellsall
fuente
2
la bandera -v lo hizo
user9869932
18

En la última versión de macOS puede usar este comando:

lsof -nP -i4TCP:$PORT | grep LISTEN

Si le resulta difícil recordar, entonces tal vez debería crear una bashfunción y exportarla con un nombre más amigable como este

vi ~/.bash_profile

y luego agregue las siguientes líneas a ese archivo y guárdelo.

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

Ahora puede escribir listening_on 80su Terminal y ver qué proceso está escuchando en el puerto 80.

arturgrigor
fuente
13

En Snow Leopard (OS X 10.6.8), ejecutar 'man lsof' produce:

lsof -i 4 -a

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

Las respuestas anteriores no funcionaban en Snow Leopard, pero estaba tratando de usar 'netstat -nlp' hasta que vi el uso de 'lsof' en la respuesta de pts.

Brent Self
fuente
10

Soy un chico de Linux. En Linux es extremadamente fácil con netstat -ltpno cualquier combinación de esas letras. Pero en Mac OS X netstat -an | grep LISTENes el más humano. Otros son muy feos y muy difíciles de recordar al solucionar problemas.

edib
fuente
2
La pregunta solicitó explícitamente un puerto TCP específico, y sus comandos muestran oyentes en todos los puertos.
pts
7
lsof -n -i | awk '{ print $1,$9; }' | sort -u

Esto muestra quién está haciendo qué. Elimine -n ​​para ver los nombres de host (un poco más lento).

Misha Tavkhelidze
fuente
1
Su respuesta no es mala, pero está en una pregunta con varias respuestas altamente votadas, y una aceptada, de hace varios años. En el futuro, trate de concentrarse en las preguntas más recientes, especialmente las que aún no han sido respondidas.
¿Este comando muestra también los puertos que no son TCP y los que no escuchan? La pregunta pregunta explícitamente por escuchas en puertos TCP solamente.
pts
Según la página de manual de 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 lo tanto, también muestra a los no oyentes, por lo que no responde a la pregunta.
pts
Agregar -sTCP:LISTENalsof
Misha Tavkhelidze
3

Esto hizo lo que necesitaba.

ps -eaf | grep `lsof -t -i:$PORT`
Franco
fuente
1

Hice un pequeño guión para ver no solo quién escucha dónde sino también para mostrar las conexiones establecidas y a qué países. Funciona en 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)

¡Esto puede ser útil para verificar si está conectado a Corea del Norte! ;-)

0x00
fuente
0

Esta es una buena manera en macOS High Sierra:

netstat -an |grep -i listen
tr4nc3
fuente
Eso es correcto! La respuesta aceptada en realidad es la forma correcta ... netstat en mac os x no muestra la asignación de pid a puerto.
tr4nc3
0

Inspirado por el usuario Brent Self:

lsof -i 4 -a | grep LISTEN

Punnerud
fuente
0

Para macOS, uso dos comandos juntos para mostrar información sobre los procesos que escuchan en la máquina y el proceso de conexión a servidores remotos. En otras palabras, para verificar los puertos de escucha y las conexiones actuales (TCP) en un host, puede usar los dos comandos siguientes juntos

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

Pensé que agregaría mi opinión, espero que pueda terminar ayudando a alguien.

Boschko
fuente