Wer überwacht einen bestimmten TCP-Port unter Mac OS X?

1382

Unter Linux kann ich verwenden netstat -pntl | grep $PORToder fuser -n tcp $PORTherausfinden, welcher Prozess (PID) den angegebenen TCP-Port überwacht. Wie erhalte ich dieselben Informationen unter Mac OS X?

pts
quelle
27
Leider netstat -p tcp | grep $PORThat PIDs nicht angezeigt werden, da netstat auf dem Mac OS X nicht PIDs anzeigen kann.
Punkte
12
netstat -anvzeigt den Port unter Mac OS X an (Quelle: Lösung unten von @SeanHamiliton)
Curtis Yallop

Antworten:

2049

Verwenden Sie unter macOS High Sierra und höher diesen Befehl:

lsof -nP -iTCP:$PORT | grep LISTEN

oder um nur IPv4 zu sehen:

lsof -nP -i4TCP:$PORT | grep LISTEN

Verwenden Sie in älteren Versionen eines der folgenden Formulare:

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

Ersetzen Sie $PORTdurch die Portnummer oder eine durch Kommas getrennte Liste von Portnummern.

Stellen Sie vor sudo(gefolgt von einem Leerzeichen), wenn Sie Informationen zu Ports unter # 1024 benötigen.

Das -nFlag dient zur Anzeige von IP-Adressen anstelle von Hostnamen. Dadurch wird der Befehl viel schneller ausgeführt, da die DNS-Suche zum Abrufen der Hostnamen langsam sein kann (einige Sekunden oder eine Minute für viele Hosts).

Die -PFlagge ist für die Anzeige von RAW - Port - Nummern statt aufgelöste Namen wie http, ftpoder eher esoterische Service - Namen wie dpserve, socalia.

Weitere Optionen finden Sie in den Kommentaren.

Der Vollständigkeit halber, weil häufig zusammen verwendet:

So töten Sie die PID:

kill -9 <PID>
# kill -9 60401
pts
quelle
153
Stellen Sie dies voran sudo, um Prozesse anzuzeigen , die Sie nicht besitzen.
Gordon Davisson
30
auf Löwe, arbeitete mit einer Änderungsudo lsof -i TCP:$PORT | grep LISTEN
Dhaval
58
Auf Mountain Lion brauchen Sie nicht grep:sudo lsof -iTCP:$PORT -sTCP:LISTEN
Siu Ching Pong -Asuka Kenji-
16
Nach so vielen Suchen ist dieser der beste. Personen, die den Befehl direkt kopieren möchten, sollten $ PORT durch die tatsächliche Portnummer ersetzen oder die Variable PORT definieren, und dies auch für mehrere Ports wie: export PORT = 8080,4433; lsof -n -i4TCP: $ PORT
siddhusingh
2
Man braucht kein Sudo, wenn der zu untersuchende Hafen über 1024 liegt.
stigkj
626

Seit Snow Leopard (10.6) bis Mojave (10.14) und Catalina (10,15) unterstützt jede Version von macOS Folgendes:

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

Persönlich habe ich diese einfache Funktion in meinem ~/.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
}

Der listeningBefehl gibt Ihnen eine Liste der Prozesse, die einen Port listening smthabhören, und sucht nach einem bestimmten Muster.

Wenn Sie dies haben, ist es ziemlich einfach, nach einem bestimmten Prozess zu fragen listening dropbox, z listening 22. B. nach einem Port, z .

lsofBefehl hat einige spezielle Optionen, um nach Port, Protokoll, Prozess usw. zu fragen, aber ich persönlich fand die obige Funktion viel praktischer, da ich mich nicht an all diese Optionen auf niedriger Ebene erinnern muss. lsofist ein ziemlich mächtiges Werkzeug, aber leider nicht so bequem zu bedienen.

Michał Kalinowski
quelle
7
Das geht in meine Punktedateien. Ich suche alle paar Monate und finde immer diese Antwort.
Danemacmillan
1
Ich bin der Meinung, dass dies als Antwort akzeptiert werden sollte, wie OP sagte -pntl, was alle Dienste auflisten würde. In der akzeptierten Antwort werden eine oder mehrere Portnummern angegeben, die nicht im entferntesten identisch sind.
Seeafish
440

Sie können auch verwenden:

sudo lsof -i -n -P | grep TCP

Dies funktioniert in Mavericks.

Rog182
quelle
3
Das -i Option macht es deutlich schneller. 0,02 Sekunden gegenüber 2 Sekunden. In meiner Bewerbung machte dies einen großen Unterschied.
Eric Boehs
Was machen diese spezifischen Flags -i, -n, -P? Ich kann nirgendwo finden, was sie genau bedeuten
Chad Watkins
sudo lsof -i -n -P | grep TCP | grep $ PORT - Ich habe mit diesem Befehl einen Alias ​​erstellt
alyn000r
Ich würde vorschlagen, "| grep $ PORT" oder "| grep LISTEN" hinzuzufügen.
KC Baltz
Großartig! Funktioniert auch auf Mojave.
Gefilte Fish
291

Update Januar 2016

Wirklich überrascht, dass niemand vorgeschlagen hat:

lsof -i :PORT_NUMBER

um die grundlegenden Informationen zu erhalten. Überprüfen Sie beispielsweise Port 1337:

lsof -i :1337

Andere Variationen, abhängig von den Umständen:

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

Darauf können Sie problemlos aufbauen, um die PID selbst zu extrahieren. Zum Beispiel:

lsof -t -i :1337

Dies entspricht auch (im Ergebnis) diesem Befehl:

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

Schnelle Illustration:

Geben Sie hier die Bildbeschreibung ein

Der Vollständigkeit halber, weil häufig zusammen verwendet:

So töten Sie die PID:

kill -9 <PID>
# kill -9 60401

oder als Einzeiler:

kill -9 $(lsof -t -i :1337)
arcseldon
quelle
2
Dieser Befehl zeigt auch PIDs an, die keine Listener sind, und die Fragen, die explizit nur für Listener gestellt werden.
Punkte
3
Sie können auch ausführen lsof -t -i :1338. -tgibt die Prozess-ID zurück, sodass Sie nicht awk / head müssen.
KFunk
Nichts funktionierte außer kill -9 $(lsof -t -i :5000)auf el capitan
goksel
Das ist toll. Ich ziehe es vor zu wissen, was da ist, bevor ich es töte, also habe ich (basierend darauf) gerade zu meinem bashrc hinzugefügt : whatsonport() { ps -ef | grep `lsof -t -i :$1` }, also:⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node .
Sigfried
1
Danke, lsof -i :PORT_NUMBERhabe einen Job für mich gemacht.
marika.daboja
79

Dies funktioniert in Mavericks (OSX 10.9.2).

sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN
Charley Wu
quelle
Ich brauchte am 10.10 kein sudo.
Sophistifunk
Arbeitete Yosemite (10.10.2)
Phillip Kamikaze
48

Für die Ports LISTEN, ESTABLISHED und CLOSED

sudo lsof -n -i -P | grep TCP

Nur für die LISTEN-Ports

sudo lsof -n -i -P | grep LISTEN

Für einen bestimmten LISTEN-Port, z. B.: Port 80

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

Oder wenn Sie nur eine kompakte Zusammenfassung wünschen [kein Dienst / keine Apps beschrieben], gehen Sie zu NETSTAT. Die gute Seite hier ist, dass kein Sudo benötigt wird

netstat -a -n | grep 'LISTEN '

Erläutern der verwendeten Elemente:

-n unterdrückt den Hostnamen

-i für IPv4- und IPv6-Protokolle

-P Portnamen weglassen

-a [über netstat] für alle Sockets

-n [über netstat] löst keine Namen auf, zeigt Netzwerkadressen als Zahlen an

Getestet auf High Sierra 10.13.3 und Mojave 10.14.3

  • Die letzte Syntax netstat funktioniert auch unter Linux
PYK
quelle
Die detaillierten Erklärungen sind für Anfänger wie mich sehr nützlich. danke @PYK
Tomaz Wang
46

Unter OS X können Sie die Option -v für netstat verwenden, um die zugehörige PID anzugeben.

Art:

netstat -anv | grep [.]PORT

Die Ausgabe sieht folgendermaßen aus:

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

Die PID ist die Nummer vor der letzten Spalte, in diesem Fall 3105

Sean Hamilton
quelle
Sie müssen auch hinzufügen grep LISTEN, um nur die Listener anzuzeigen.
Punkte
3
Das habe ich gebraucht! lsofkonnte den Hafen nicht finden. aber netstatzeigte, dass es offen war. -vwar die geheime Sauce, die mir fehlte.
Aaron McMillin
32

Unter macOS können Sie auf einfache Weise die Prozess-ID abrufen , die einen bestimmten Port mit netstat überwacht . In diesem Beispiel wird nach einem Prozess gesucht, der Inhalte auf Port 80 bereitstellt:

Suchen Sie den Server, der auf Port 80 ausgeführt wird

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

Beispielausgabe

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

Die 2. aus der letzten Spalte ist die PID. Oben ist es 715 .

Optionen

-a - Alle Ports anzeigen, einschließlich der von Servern verwendeten

-n- Zahlen anzeigen, keine Namen nachschlagen. Dies macht den Befehl viel schneller

-v - ausführliche Ausgabe, um die Prozess-IDs zu erhalten

-w- Wörter suchen. Andernfalls gibt der Befehl Informationen für die Ports 8000 und 8001 zurück, nicht nur "80".

LISTEN - Geben Sie Informationen nur für Ports im LISTEN-Modus an, dh für Server

johntellsall
quelle
2
die -v Flagge hat es geschafft
user9869932
18

In der neuesten macOS-Version können Sie diesen Befehl verwenden:

lsof -nP -i4TCP:$PORT | grep LISTEN

Wenn Sie sich nur schwer merken können, sollten Sie möglicherweise eine bashFunktion erstellen und mit einem freundlicheren Namen wie diesem exportieren

vi ~/.bash_profile

Fügen Sie dann die folgenden Zeilen zu dieser Datei hinzu und speichern Sie sie.

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

Jetzt können Sie listening_on 80Ihr Terminal eingeben und sehen, welcher Prozess den Port überwacht 80.

Arturgrigor
quelle
13

Auf Snow Leopard (OS X 10.6.8) ergibt das Ausführen von "man lsof":

lsof -i 4 -a

(Die tatsächliche manuelle Eingabe lautet 'lsof -i 4 -a -p 1234')

Die vorherigen Antworten funktionierten bei Snow Leopard nicht, aber ich habe versucht, 'netstat -nlp' zu verwenden, bis ich die Verwendung von 'lsof' in der Antwort von pts sah.

Brent Self
quelle
10

Ich bin ein Linux-Typ. Unter Linux ist es mit netstat -ltpnoder einer beliebigen Kombination dieser Buchstaben extrem einfach . Aber unter Mac OS X netstat -an | grep LISTENist das am menschlichsten. Andere sind sehr hässlich und bei der Fehlerbehebung nur schwer zu merken.

edib
quelle
2
Die Frage wurde explizit nach einem bestimmten TCP-Port gestellt, und Ihre Befehle zeigen Listener an allen Ports an.
Punkte
7
lsof -n -i | awk '{ print $1,$9; }' | sort -u

Dies zeigt an, wer was tut. Entfernen Sie -n, um Hostnamen anzuzeigen (etwas langsamer).

Mischa Tavkhelidze
quelle
1
Ihre Antwort ist nicht schlecht, aber es handelt sich um eine Frage mit mehreren hoch bewerteten und einer akzeptierten Antwort von vor mehreren Jahren. Versuchen Sie in Zukunft, sich auf neuere Fragen zu konzentrieren, insbesondere auf Fragen, die noch nicht beantwortet wurden.
Zeigt dieser Befehl auch Nicht-TCP-Ports und Nicht-Listener an? In der Frage werden explizit nur Listener an TCP-Ports abgefragt.
Punkte
If no address is specified, this option [-i] selects the listing of all Internet and x.25 (HP-UX) network files.
Gemäß
@ Mischa Tavkhelidze: Es werden also auch Nicht-Hörer angezeigt, sodass die Frage nicht beantwortet wird.
Punkte
Hinzufügen -sTCP:LISTENzulsof
Misha Tavkhelidze
3

Das hat getan, was ich brauchte.

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

Ich habe ein kleines Skript erstellt, um nicht nur zu sehen, wer wo zuhört, sondern auch um etablierte Verbindungen und zu welchen Ländern anzuzeigen. Funktioniert unter 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)

Dies kann nützlich sein, um zu überprüfen, ob Sie mit Nordkorea verbunden sind! ;-);

0x00
quelle
0

Dies ist ein guter Weg unter macOS High Sierra:

netstat -an |grep -i listen
tr4nc3
quelle
Das ist ganz richtig! Die akzeptierte Antwort ist tatsächlich der richtige Weg ... netstat auf Mac OS X zeigt die Zuordnung von PID zu Port nicht an.
tr4nc3
0

Inspiriert vom Benutzer Brent Self:

lsof -i 4 -a | grep LISTEN

Punnerud
quelle
0

Für macOS verwende ich zwei Befehle zusammen, um Informationen zu den Prozessen anzuzeigen, die auf dem Computer abhören und die Verbindung zu Remote-Servern herstellen. Mit anderen Worten, um die Überwachungsports und die aktuellen (TCP) Verbindungen auf einem Host zu überprüfen, können Sie die beiden folgenden Befehle zusammen verwenden

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

Ich dachte, ich würde meinen Input hinzufügen, hoffentlich kann er jemandem helfen.

Boschko
quelle