¿Cómo saber qué puertos escuchan ciertos PID?

13

Tengo un PID de cierto proceso que escucha algunos puertos en mi OS X y necesito saber qué puerto escucha este proceso. ¿Cómo puedo hacerlo?

Sé que puedo usar lsofpara saber qué proceso está escuchando algún puerto, pero necesito realizar una operación inversa.

Gracias.

UPD

OS X usa utilidades BSD, así que tengo BSD, netstatno Linux netstat. Linux netstattiene la -popción de mostrar PID, BSD netstatutiliza -ppara especificar el puerto y no tiene opción para mostrar PID.

shau-kote
fuente
¿Quiere decir que está tratando de encontrar los puertos que escucha un proceso? netstatpuede hacer esto por ti Puede grepen el PID si desea filtrar la salida denetstat
Centimane
También el lsofuso no es solo de una manera. usted puede hacer algo así lsof|grep ${PID}. que volcará todo groseramente y grepseleccionará las líneas con PID en ellas. En una remota posibilidad de, podría enumerar una línea irrelevante, debido al número PID emparejando por error algún otro valor pero las posibilidades son casi nulas
MelBurslan
@Dave, sí, sígueme bien. Además, como puedo ver, la versión BSD de netstatno puede mostrar PID.
shau-kote
@MelBurslan no parece una solución ordenada. Además, no es rápido: lleva un tiempo en mi MBP.
shau-kote

Respuestas:

13

He encontrado una solución por mi cuenta leyendo en profundidad man lsof. (Sí, RT * M todavía ayuda.) Gracias @Gilles por apuntar.

Aquí está la solución: lsof -aPi -p 555 (555 es el PID).

Explicación:

  1. -p para especificar el número PID;
  2. -i para mostrar solo dispositivos de red;
  3. -a a Y dos condiciones anteriores (de lo contrario serán ORed);
  4. -P para mostrar los números de puerto (en su lugar, los nombres de puerto de forma predeterminada).

Además, uno puede usar lsof -aPi4 -p 555o lsof -aPi6 -p 55para direcciones IPv4 o IP6 solo en consecuencia.

Si la salida será analizada por otra -Fnopción de programa , puede ser útil. Con esta opción lsof, producirá "salida para otro programa" en lugar de una salida con formato agradable. lsof -aPi4 -Fn -p 555generará algo como esto:

p554
nlocalhost:4321

PD: todo lo he probado en mi OS X El Capitan, pero como puedo ver, también debería funcionar en Linux.

shau-kote
fuente
6

lsofproporciona información sobre archivos abiertos por procesos, incluidos los puertos de red. Está disponible en casi todos los sistemas Unix, incluido OSX .

La piedra de Rosetta para Unix no muestra ninguna otra herramienta para “proceso de emparejamiento de archivo o puerto” en OSX.

Para enumerar procesos que escuchan en un puerto TCP, puede usar

lsof -iTCP -sTCP:LISTEN

lsof -iUDPenumera los procesos que tienen un socket UDP abierto. lsof -ienumera todos los sockets de red abiertos (clientes TCP, servidores TCP y otros protocolos IP).

Gilles 'SO- deja de ser malvado'
fuente
0

si desea saber qué puerto está escuchando, puede usar la opción -p de netstat. Debe ser el superusuario:

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

si quieres saber más al respecto prueba este enlace

Vinood NK Maheshwari
fuente
Se trata de GNU netstat, tengo OS X y, por lo tanto, uso BSD netstat. Se utiliza -ppara especificar el puerto TCP / IP, y no tiene la opción de mostrar PID.
shau-kote
0

En FreeBSD, puede usar sockstatpara esta información. No estoy seguro de si OS X tiene sockstat, ya que no tengo una Mac.

Por ejemplo, para ver todas las conexiones TCPv4:

sockstat -4

GROND
fuente
Alack, no hay sockstatcomando en mi Mac. :(
shau-kote
0

Puede concatenar netstat con grep, awk y sed para mostrar puertos con sus correspondientes pids en Linux y Cygwin:

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

Más detalles

Atelier Iris
fuente