Хто слухає даний порт TCP на Mac OS X?


1381

У Linux я можу використовувати netstat -pntl | grep $PORTабо fuser -n tcp $PORTдізнатися, який процес (PID) прослуховує на вказаному порті TCP. Як отримати ту саму інформацію в Mac OS X?


27
На жаль, netstat -p tcp | grep $PORTне відображаються PID, оскільки netstat в Mac OS X не може відображати PID.
пт

12
netstat -anvвідображає порт на Mac OS X (джерело: рішення нижче від @SeanHamiliton)
Кертіс Яллоп,

Відповіді:


2047

У macOS High Sierra та пізніших версіях використовуйте цю команду:

lsof -nP -iTCP:$PORT | grep LISTEN

або просто побачити лише IPv4:

lsof -nP -i4TCP:$PORT | grep LISTEN

Для старих версій використовуйте одну з таких форм:

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

Замініть $PORTномер порту або відокремлений комою список номерів портів.

Попередьте sudo(з пробілом), якщо вам потрібна інформація про порти нижче №1024.

-nПрапор для відображення IP - адреси замість імен хостів. Це змушує команду виконуватись набагато швидше, оскільки пошук DNS для отримання імен хостів може бути повільним (кілька секунд або хвилину для багатьох хостів).

-PПрапор для відображення сирих номерів портів замість дозволених імен , як http, ftpабо більш езотеричні імена сервісів , таких як dpserve, socalia.

Дивіться коментарі для додаткових варіантів.

Для повноти, тому що часто використовується разом:

Щоб вбити PID:

kill -9 <PID>
# kill -9 60401

153
Префікс цього, sudoщоб побачити процеси, якими ви не володієте.
Гордон Девіссон

30
на Лева, працював зі зміноюsudo lsof -i TCP:$PORT | grep LISTEN
dhaval

58
На гірському Леві вам не потрібно grep:sudo lsof -iTCP:$PORT -sTCP:LISTEN
Сіу Чін Понг - Асука Кенджі -

16
після стількох пошуків цей найкращий. люди, які безпосередньо хочуть скопіювати команду, повинні замінити $ PORT на фактичний номер порту або визначити змінну PORT, а також для кількох портів, таких як: export PORT = 8080,4433; lsof -n -i4TCP: $ PORT
siddhusingh

2
Не потрібно судо, якщо порт для дослідження знаходиться вище 1024.
stigkj

626

Оскільки Snow Leopard (10.6), аж до Mojave (10.14) та Catalina (10,15) , кожна версія macOS підтримує це:

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

Особисто я закінчив цю просту функцію у своєму ~/.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
}

Потім listeningкоманда дає вам перелік процесів прослуховування на якомусь порту та listening smthсхвалює це за деяким шаблоном.

Маючи це, досить легко запитати про конкретний процес, наприклад listening dropbox, або порт, наприклад listening 22.

lsofКоманда має деякі спеціалізовані варіанти запитання про порт, протокол, процес тощо, але особисто я знайшов вище функцію набагато зручнішою, оскільки мені не потрібно пам’ятати всі ці низькорівневі параметри. lsofє досить потужним інструментом, але, на жаль, не таким зручним у використанні.


7
Це відбувається в моїх точкових файлах. Я шукаю кожні кілька місяців і завжди приходжу до цієї відповіді.
danemacmillan

1
Я вважаю, що на це слід прийняти відповідь, як він сказав, що він робить -pntl, і в якому перераховуються всі служби. Прийнята відповідь вимагає вказати один або кілька номерів портів, що віддалено не є однаковим.
seeafish

440

Ви також можете використовувати:

sudo lsof -i -n -P | grep TCP

Це працює в Mavericks.


3
Цей -iваріант робить його значно швидшим. 0,02 секунди проти 2 секунд У моїй заявці це мало різницю.
Ерік Буес

що роблять ці конкретні прапори -i, -n, -P. Я ніде не можу знайти, що вони точно означають
Чад Уоткінс

sudo lsof -i -n -P | греп TCP | grep $ PORT - я створив псевдонім з цією командою
alyn000r

Я б запропонував додати "| grep $ PORT" або "| grep LISTEN"
KC Baltz

Чудово! Працює також над Mojave.
Риба Гефільт

291

Оновлення січня 2016 року

Дійсно здивований, ніхто не пропонує:

lsof -i :PORT_NUMBER

щоб отримати необхідну основну інформацію. Наприклад, перевірка порту 1337:

lsof -i :1337

Інші зміни, залежно від обставин:

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

Ви можете легко спиратися на це, щоб витягнути PID. Наприклад:

lsof -t -i :1337

що також еквівалентно (в результаті) цій команді:

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

Швидка ілюстрація:

введіть тут опис зображення

Для повноти, тому що часто використовується разом:

Щоб вбити PID:

kill -9 <PID>
# kill -9 60401

або як один вкладиш:

kill -9 $(lsof -t -i :1337)

2
Ця команда також відображає PID, які не слухають слухачів, і запитання прямо задаються лише слухачам.
пт

3
Ви також можете бігати lsof -t -i :1338. -tповерне ідентифікатор процесу, тож вам не доведеться будити / головувати.
KFunk

Нічого не працювало, окрім kill -9 $(lsof -t -i :5000)el capitan
goksel

Це чудово. Я вважаю за краще знати, що там, перш ніж вбити його, тому (виходячи з цього) я щойно додав до свого bashrc:, whatsonport() { ps -ef | grep `lsof -t -i :$1` }так:⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node .
Sigfried

1
Дякую, lsof -i :PORT_NUMBERзробили роботу для мене.
marika.daboja


48

Для портів LISTEN, ESTABLISHED та CLOSED

sudo lsof -n -i -P | grep TCP

Лише для портів LISTEN

sudo lsof -n -i -P | grep LISTEN

Для конкретного LISTEN-порта, наприклад: порт 80

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

Або якщо ви просто хочете компактне резюме [немає описаних служб / додатків], перейдіть до NETSTAT. Хороша сторона тут, жодне судо не потрібно

netstat -a -n | grep 'LISTEN '

Пояснення використаних елементів:

-на придушити ім'я хоста

-i для протоколів IPv4 та IPv6

опустити імена портів

-a [понад netstat] для всіх розеток

-n [понад netstat] не вирішує імена, показувати мережеві адреси як числа

Випробували на Високій Сьєррі 10.13.3 та Мохаве 10.14.3

  • останній синтаксис netstat працює і на Linux

Детальні пояснення насправді дуже корисні для початківців, як я. дякую @PYK
Ван

46

в OS X ви можете використовувати опцію -v для netstat, щоб надати відповідний pid.

тип:

netstat -anv | grep [.]PORT

вихід буде виглядати приблизно так:

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

PID - номер перед останнім стовпцем, 3105 для цього випадку


Вам також потрібно додати, grep LISTENщоб показати лише слухачам.
пт

3
Це те, що мені було потрібно! lsofне вдалося знайти порт. але netstatпоказав, що це відкрито. -vбув секретний соус, якого мені бракувало.
Аарон Макміллін

32

У macOS ось простий спосіб отримати ідентифікатор процесу, який прослуховується на певному порті за допомогою netstat . Цей приклад шукає процес подачі вмісту на порт 80:

знайти сервер, що працює на порту 80

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

вибірка вибірки

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

Другий з останнього стовпця - PID. Вгорі це 715 .

варіанти

-a - показати всі порти, включаючи ті, які використовуються серверами

-n- показувати номери, не шукати імена. Це робить команду набагато швидшою

-v - багатослівний вихід, щоб отримати ідентифікатори процесу

-w- пошукові слова. Інакше команда поверне інформацію для портів 8000 та 8001, а не лише "80"

LISTEN - надавати інформацію лише для портів у режимі LISTEN, тобто серверів


2
прапор -v зробив це
користувач9869932

18

В останній версії macOS ви можете використовувати цю команду:

lsof -nP -i4TCP:$PORT | grep LISTEN

Якщо вам важко запам'ятати, можливо, вам слід створити bash функцію та експортувати її з таким дружнім іменем

vi ~/.bash_profile

а потім додайте в цей файл наступні рядки та збережіть його.

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

Тепер ви можете набрати listening_on 80термінал і побачити, який процес прослуховується в порту 80.


13

На Snow Leopard (OS X 10.6.8), працює "man lsof":

lsof -i 4 -a

(фактичний ручний запис "lsof -i 4 -a -p 1234")

Попередні відповіді не працювали на Snow Leopard, але я намагався використати 'netstat -nlp', поки не побачив використання 'lsof' у відповіді очками.


10

Я хлопець Linux. В Linux це надзвичайно просто з netstat -ltpnбудь-якою комбінацією цих літер. Але в Mac OS X netstat -an | grep LISTENє найбільш гуманним. Інших дуже некрасиво і дуже важко запам'ятати при усуненні неполадок.


2
У цьому питанні явно задано конкретний порт TCP, і ваші команди показують слухачам у всіх портах.
пт

7
lsof -n -i | awk '{ print $1,$9; }' | sort -u

Це показує, хто що робить. Видаліть -n, щоб побачити імена хостів (трохи повільніше).


1
Ваша відповідь не є поганою, але це питання на кілька висококваліфікованих відповідей та прийнятих, що знаходяться з декількох років тому. Надалі спробуйте зосередитись на більш пізніх питаннях, особливо на тих, на які ще не відповіли.

Чи відображає ця команда також порти, що не є TCP, а також неслухачі? Це питання явно задає слухачам лише порти TCP.
пт

Сторінка lsof (8) man page: If no address is specified, this option [-i] selects the listing of all Internet and x.25 (HP-UX) network files.
Міша Тавхелідзе

@Misha Tavkhelidze: Таким чином, він відображає і не слухачів, тому він не відповідає на питання.
пт

Додати -sTCP:LISTENдоlsof
Міша Тавхелідзе,


1

Я створив невеликий сценарій, щоб побачити не лише хто слухає, а й відображати встановлені зв’язки та до яких країн. Працює на 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)

Це може бути корисно, щоб перевірити, чи ви підключені до Північної Кореї! ;-)


0

Це хороший спосіб на macOS High Sierra:

netstat -an |grep -i listen

Це цілком правильно! Прийнята відповідь насправді є правильним способом ... netstat на mac os x не відображає пид для відображення портів.
tr4nc3


0

Для macOS я використовую дві команди разом, щоб показати інформацію про прослуховування процесів на машині та про підключення до віддалених серверів. Іншими словами, для перевірки портів прослуховування та поточних (TCP) з'єднань на хості ви можете використовувати дві наступні команди разом

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

Думав, що я додам свій внесок, сподіваюся, це може допомогти комусь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.