Kto nasłuchuje na danym porcie TCP w systemie Mac OS X?

1381

W systemie Linux mogę użyć netstat -pntl | grep $PORTlub, fuser -n tcp $PORTaby dowiedzieć się, który proces (PID) nasłuchuje na określonym porcie TCP. Jak uzyskać te same informacje w systemie Mac OS X?

pkt
źródło
27
Niestety, netstat -p tcp | grep $PORTnie wyświetla PID, ponieważ netstat na Mac OS X nie może wyświetlać PID.
pkt
12
netstat -anvwyświetla port w Mac OS X (źródło: rozwiązanie poniżej autorstwa @SeanHamiliton)
Curtis Yallop

Odpowiedzi:

2047

W systemie macOS High Sierra i nowszych użyj tego polecenia:

lsof -nP -iTCP:$PORT | grep LISTEN

lub po prostu zobaczyć tylko IPv4:

lsof -nP -i4TCP:$PORT | grep LISTEN

W starszych wersjach użyj jednej z następujących formularzy:

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

Zastąp $PORTnumer portu lub oddzieloną przecinkami listę numerów portów.

sudoJeśli potrzebujesz informacji o portach poniżej # 1024, dodaj (po której następuje spacja).

-nFlaga jest do wyświetlania adresów IP zamiast nazw hostów. To sprawia, że ​​polecenie wykonuje się znacznie szybciej, ponieważ wyszukiwanie DNS w celu uzyskania nazw hostów może być wolne (kilka sekund lub minuta dla wielu hostów).

-PFlaga jest do wyświetlania surowe numery portów zamiast nazwy, jak rozwiązane http, ftplub bardziej ezoterycznych nazw usług, takich jak dpserve, socalia.

Zobacz komentarze, aby uzyskać więcej opcji.

Dla kompletności, ponieważ często używane razem:

Aby zabić PID:

kill -9 <PID>
# kill -9 60401
pkt
źródło
153
Poprzedź to znakiem, sudoaby zobaczyć procesy, których nie jesteś właścicielem.
Gordon Davisson,
30
na lwie, pracował ze zmianąsudo lsof -i TCP:$PORT | grep LISTEN
dhaval
58
Na Mountain Lion nie potrzebujesz grep:sudo lsof -iTCP:$PORT -sTCP:LISTEN
Siu Ching Pong -Asuka Kenji-
16
po tylu wyszukiwaniach ten jest najlepszy. ludzie, którzy bezpośrednio chcą skopiować polecenie, powinni zamienić $ PORT na rzeczywisty numer portu lub zdefiniować zmienną PORT i to również dla wielu portów, takich jak: export PORT = 8080,4433; lsof -n -i4TCP: $ PORT
siddhusingh
2
Nie trzeba sudo, jeśli port do zbadania jest
większy
626

Od wersji Snow Leopard (10.6), aż do Mojave (10.14) i Catalina (10,15) , każda wersja macOS obsługuje to:

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

Osobiście skończyłem z tą prostą funkcją w moim ~/.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
}

Następnie listeningpolecenie wyświetla listę procesów nasłuchujących na niektórych portach ilistening smth grepuje to dla jakiegoś wzorca.

Mając to, dość łatwo jest zapytać o konkretny proces, np. listening dropboxPort, np listening 22.

lsofpolecenie ma pewne wyspecjalizowane opcje zapytań o port, protokół, proces itp., ale osobiście uważam, że powyższa funkcja jest o wiele bardziej przydatna, ponieważ nie muszę pamiętać wszystkich tych opcji niskiego poziomu. lsofjest dość potężnym narzędziem, ale niestety nie jest tak wygodne w użyciu.

Michał Kalinowski
źródło
7
To dzieje się w moich plikach dot. Przeszukuję co kilka miesięcy i zawsze napotykam tę odpowiedź.
danemacmillan
1
Uważam, że należy zaakceptować odpowiedź, tak jak OP powiedział, że tak -pntl, która zawiera listę wszystkich usług. Akceptowana odpowiedź wymaga podania jednego lub więcej numerów portów, co nie jest tym samym.
patrz
440

Możesz także użyć:

sudo lsof -i -n -P | grep TCP

Działa to w Mavericks.

Rog182
źródło
3
Ta -iopcja znacznie przyspiesza. 0,02 sekundy vs 2 sekundy. W mojej aplikacji robiło to różnicę.
Eric Boehs,
co robią te konkretne flagi -i, -n, -P. Nie mogę znaleźć nigdzie, co dokładnie oznaczają
Chad Watkins
sudo lsof -i -n -P | grep TCP | grep $ PORT -
Utworzyłem
Sugerowałbym dodanie „| grep $ PORT” lub „| grep LISTEN”
KC Baltz
Świetny! Działa również na Mojave.
Gefilte Fish,
291

Aktualizacja ze stycznia 2016 r

Naprawdę zaskoczony nikt nie sugerował:

lsof -i :PORT_NUMBER

aby uzyskać wymagane podstawowe informacje. Na przykład sprawdzanie portu 1337:

lsof -i :1337

Inne warianty, w zależności od okoliczności:

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

Możesz łatwo to wykorzystać, aby wyodrębnić sam PID. Na przykład:

lsof -t -i :1337

co jest również równoważne (w wyniku) z tym poleceniem:

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

Szybka ilustracja:

wprowadź opis zdjęcia tutaj

Dla kompletności, ponieważ często używane razem:

Aby zabić PID:

kill -9 <PID>
# kill -9 60401

lub jako jedna wkładka:

kill -9 $(lsof -t -i :1337)
arcseldon
źródło
2
To polecenie wyświetla również PID nie będące odbiornikami, a pytania wyraźnie zadawane tylko dla słuchaczy.
pts
3
Możesz także biegać lsof -t -i :1338. -tzwróci identyfikator procesu, więc nie będziesz musiał przebudzać / head.
KFunk
Nic nie działało, oprócz kill -9 $(lsof -t -i :5000)el
capitan
To jest świetne. Wolę wiedzieć, co tam jest, zanim go zabiję, więc (w oparciu o to) właśnie dodałem do mojego bashrc:, whatsonport() { ps -ef | grep `lsof -t -i :$1` }więc:⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node .
Sigfried
1
Dzięki, lsof -i :PORT_NUMBERzrobiłem dla mnie robotę.
marika.daboja
79

Działa to w Mavericks (OSX 10.9.2).

sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN
Charley Wu
źródło
Nie potrzebowałem sudo 10.10.
Sophistifunk,
Pracował Yosemite (10.10.2)
Phillip Kamikaze
48

Dla portów LISTEN, ESTABLISHED i CLOSED

sudo lsof -n -i -P | grep TCP

Tylko dla portów LISTEN

sudo lsof -n -i -P | grep LISTEN

Dla konkretnego portu LISTEN, np .: port 80

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

Lub jeśli chcesz tylko zwięzłe podsumowanie [nie opisano usługi / aplikacji], skorzystaj z NETSTAT. Dobrą stroną jest to, że sudo nie jest potrzebne

netstat -a -n | grep 'LISTEN '

Wyjaśnienie używanych przedmiotów:

-n pomiń nazwę hosta

-i dla protokołów IPv4 i IPv6

-P pomiń nazwy portów

-a [over netstat] dla wszystkich gniazd

-n [over netstat] nie rozpoznaje nazw, pokazuje adresy sieciowe jako liczby

Testowane na High Sierra 10.13.3 i Mojave 10.14.3

  • ostatnia składnia netstat działa również na systemie Linux
PYK
źródło
Szczegółowe wyjaśnienia są w rzeczywistości bardzo przydatne dla początkujących, takich jak ja. dzięki @PYK
Tomaz Wang
46

w systemie OS X można użyć opcji -v dla netstat, aby podać powiązany pid.

rodzaj:

netstat -anv | grep [.]PORT

wynik będzie wyglądał następująco:

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

PID to liczba przed ostatnią kolumną, 3105 w tym przypadku

Sean Hamilton
źródło
Musisz także dodać, grep LISTENaby pokazać tylko słuchaczy.
pts
3
Właśnie tego potrzebowałem! lsofnie mogłem znaleźć portu. ale netstatpokazał, że jest otwarty. -vbył sekretny sos, którego mi brakowało.
Aaron McMillin
32

W systemie macOS jest prosty sposób na uzyskanie identyfikatora procesu, który nasłuchuje na określonym porcie za pomocą netstat . W tym przykładzie szuka procesu obsługującego zawartość na porcie 80:

znajdź serwer działający na porcie 80

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

próbka wyjściowa

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

Drugim z ostatniej kolumny jest PID. Powyżej jest 715 .

opcje

-a - pokaż wszystkie porty, w tym te używane przez serwery

-n- pokaż liczby, nie szukaj nazw. To sprawia, że ​​polecenie jest znacznie szybsze

-v - pełne wyjście, aby uzyskać identyfikatory procesu

-w- wyszukiwane słowa. W przeciwnym razie polecenie zwróci informacje dla portów 8000 i 8001, a nie tylko „80”

LISTEN - podaj informacje tylko dla portów w trybie LISTEN, tj. serwerów

johntellsall
źródło
2
flaga -v to zrobiła
user9869932
18

W najnowszej wersji systemu macOS możesz użyć tego polecenia:

lsof -nP -i4TCP:$PORT | grep LISTEN

Jeśli trudno ci zapamiętać, być może powinieneś utworzyć bashfunkcję i wyeksportować ją pod bardziej przyjazną nazwą

vi ~/.bash_profile

a następnie dodaj następujące wiersze do tego pliku i zapisz go.

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

Teraz możesz wpisać listening_on 80swój Terminal i zobaczyć, który proces nasłuchuje na porcie 80.

arturgrigor
źródło
13

W systemie Snow Leopard (OS X 10.6.8) uruchomienie „man lsof” daje:

lsof -i 4 -a

(rzeczywiste ręczne wprowadzanie to „lsof -i 4 -a -p 1234”)

Poprzednie odpowiedzi nie działały na systemie Snow Leopard, ale próbowałem użyć „netstat -nlp”, dopóki nie zobaczyłem użycia „lsof” w odpowiedzi przez pts.

Brent Self
źródło
10

Jestem facetem z Linuksa. W Linuksie jest to niezwykle łatwe z netstat -ltpndowolną kombinacją tych liter. Ale w Mac OS X netstat -an | grep LISTENjest najbardziej humanitarny. Inne są bardzo brzydkie i bardzo trudne do zapamiętania podczas rozwiązywania problemów.

edib
źródło
2
Pytanie wyraźnie zadało pytanie o konkretny port TCP, a twoje polecenia pokazują słuchaczy na wszystkich portach.
pkt
7
lsof -n -i | awk '{ print $1,$9; }' | sort -u

Wyświetla kto co robi. Usuń -n, aby zobaczyć nazwy hostów (nieco wolniej).

Misha Tavkhelidze
źródło
1
Twoja odpowiedź nie jest zła, ale dotyczy pytania z kilkoma bardzo pozytywnymi odpowiedziami i jedną z wielu lat temu. W przyszłości postaraj się skupić na nowszych pytaniach, zwłaszcza tych, na które jeszcze nie udzielono odpowiedzi.
Czy to polecenie wyświetla również porty inne niż TCP, a także nie nasłuchuje? Pytanie wyraźnie dotyczy słuchaczy tylko na portach TCP.
pts
Według strony If no address is specified, this option [-i] selects the listing of all Internet and x.25 (HP-UX) network files.
podręcznika lsof
@Misha Tavkhelidze: Więc wyświetla również osoby nie słuchające, więc nie odpowiada na pytanie.
pts
Dodaj -sTCP:LISTENdolsof
Misha Tavkhelidze
3

Zrobiłem to, czego potrzebowałem.

ps -eaf | grep `lsof -t -i:$PORT`
Szczery
źródło
1

Zrobiłem mały skrypt, aby zobaczyć nie tylko, kto nas słucha, ale także, aby wyświetlić ustanowione połączenia i do jakich krajów. Działa na 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)

Może to być przydatne, aby sprawdzić, czy jesteś podłączony do Korei Północnej! ;-)

0x00
źródło
0

To dobry sposób na macOS High Sierra:

netstat -an |grep -i listen
tr4nc3
źródło
Zgadza się! Akceptowana odpowiedź jest właściwie właściwą drogą ... netstat na Mac OS X nie pokazuje mapowania pid na port.
tr4nc3
0

Inspirowany przez użytkownika Brent Self:

lsof -i 4 -a | grep LISTEN

Punnerud
źródło
0

W systemie macOS używam dwóch poleceń razem, aby wyświetlić informacje o procesach nasłuchujących na komputerze i procesach łączenia się ze zdalnymi serwerami. Innymi słowy, aby sprawdzić porty nasłuchujące i bieżące połączenia (TCP) na hoście, możesz użyć dwóch poniższych poleceń razem

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

Pomyślałem, że dodam swój wkład, mam nadzieję, że w końcu może komuś pomóc.

Boschko
źródło