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?


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

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.


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.


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)

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


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

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


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


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.


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.


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.


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).


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`

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! ;-)


0

To dobry sposób na macOS High Sierra:

netstat -an |grep -i listen

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.