Woher wissen, welche Ports von einer bestimmten PID abgehört werden?

13

Ich habe eine PID eines bestimmten Prozesses, der einige Ports auf meinem OS X überwacht, und ich muss wissen, welche Ports von diesem Prozess überwacht werden. Wie kann ich es tun?

Ich weiß, dass ich verwenden kann, um lsofzu wissen, welcher Prozess einen Port überwacht, aber ich muss eine inverse Operation ausführen.

Vielen Dank.

UPD

OS X verwendet BSD-Utils, daher habe ich BSD netstatnicht Linux netstat. Linux netstathat die -pOption, PIDs anzuzeigen, BSD verwendet , um den Port anzugeben, und hat keine Option, PIDs anzuzeigen .netstat-p

Shau-Kote
quelle
Wollen Sie damit sagen, dass Sie versuchen, die Ports zu finden, an denen ein Prozess empfangsbereit ist? netstatkann das für dich tun. Sie können grepauf der PID, wenn Sie die Ausgabe von filtern möchtennetstat
Centimane
auch die lsofnutzung ist nicht nur eine möglichkeit. Sie können so etwas tun lsof|grep ${PID}. das wird alles grob entleeren und grepdie Zeilen mit PID in ihnen auswählen. Bei einer Unmöglichkeit wird möglicherweise eine irrelevante Zeile
angezeigt
@ Dave, ja, du folgst mir richtig. Wie ich sehen kann, kann die BSD-Version von netstatPIDs nicht anzeigen.
Shau-Kote
@ MelBurslan es sieht nicht nach einer ordentlichen Lösung aus. Außerdem ist es nicht schnell - es dauert einige Zeit auf meinem MBP.
Shau-Kote

Antworten:

13

Ich habe selbst eine Lösung gefunden, indem ich tief durchgelesen habe man lsof. (Ja, RT * M hilft immer noch.) Vielen Dank an @Gilles für das Zielen.

Hier ist die Lösung: lsof -aPi -p 555 (555 ist die PID).

Erläuterung:

  1. -p um die PID-Nummer anzugeben;
  2. -i um nur Netzwerkgeräte anzuzeigen;
  3. -a zu UND zwei Bedingungen oben (sonst werden sie ODER-verknüpft);
  4. -P um Portnummern anzuzeigen (stattdessen standardmäßig Portnamen).

Zusätzlich kann man lsof -aPi4 -p 555oder verwendenlsof -aPi6 -p 55 für IPv4 oder IP6 nur Adressen entsprechend verwenden.

Wenn die Ausgabe von einem anderen Programm analysiert wird, -Fnkann dies hilfreich sein. Mit dieser Option lsofwird "Ausgabe für anderes Programm" anstelle einer schön formatierten Ausgabe erzeugt. lsof -aPi4 -Fn -p 555wird so etwas ausgeben:

p554
nlocalhost:4321

PS Ich habe alles auf meinem OS X El Capitan getestet, aber wie ich sehen kann, sollte es auch unter Linux funktionieren.

Shau-Kote
quelle
6

lsofStellt Informationen zu Dateien bereit, die von Prozessen geöffnet wurden, einschließlich Netzwerkports. Es ist auf so ziemlich allen Unix-Systemen verfügbar, einschließlich OSX .

Der Rosetta Stone für Unix listet unter OSX kein anderes Tool zum „Abgleichen von Prozessen mit Dateien oder Ports“ auf.

Mit dieser Option können Sie Prozesse auflisten, die einen TCP-Port überwachen

lsof -iTCP -sTCP:LISTEN

lsof -iUDPListet Prozesse auf, bei denen ein UDP-Socket geöffnet ist. lsof -ilistet alle offenen Netzwerk-Sockets auf (TCP-Clients, TCP-Server und andere IP-Protokolle).

Gilles 'SO - hör auf böse zu sein'
quelle
0

Wenn Sie wissen möchten, welcher Port empfangsbereit ist, können Sie die Option -p von netstat verwenden. Sie müssen der Superuser sein:

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

Wenn Sie mehr darüber wissen möchten, versuchen Sie diesen Link

Vinood NK Maheshwari
quelle
Es geht um GNU netstat, ich habe OS X und benutze daher BSD netstat. Es wird verwendet -p, um den TCP / IP-Port anzugeben, und es kann keine PID angezeigt werden.
Shau-Kote
0

Unter FreeBSD können Sie sockstatdiese Informationen verwenden. Ich bin nicht sicher, ob OS X hatsockstat , da ich keinen Mac habe.

So können Sie beispielsweise alle TCPv4-Verbindungen anzeigen:

sockstat -4

GROND
quelle
Alack, sockstatauf meinem Mac gibt es keinen Befehl. :(
Shau-Kote
0

Sie können netstat mit grep, awk und sed verketten, um die Ports mit den entsprechenden Pids unter Linux und Cygwin anzuzeigen:

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

Mehr Details

Atelier Iris
quelle