Кто прослушивает данный TCP-порт в Mac OS X?

В Linux я могу использовать netstat -pntl | grep $PORT или fuser -n tcp $PORT, чтобы узнать, какой процесс (PID) прослушивает указанный порт TCP. Как мне получить ту же информацию в Mac OS X?


person pts    schedule 12.12.2010    source источник
comment
К сожалению, netstat -p tcp | grep $PORT не отображает PID, поскольку netstat в Mac OS X не может отображать PID.   -  person pts    schedule 12.12.2010
comment
netstat -anv отображает порт в Mac OS X (источник: решение, приведенное ниже @SeanHamiliton)   -  person Curtis Yallop    schedule 27.04.2018


Ответы (17)


В macOS Big Sur и новее используйте эту команду:

sudo lsof -i -P | grep LISTEN

или просто увидеть IPv4:

sudo lsof -nP -i4TCP:$PORT | grep LISTEN

В более старых версиях используйте одну из следующих форм:

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

Замените $PORT номером порта или списком номеров портов, разделенных запятыми.

Если вам нужна информация о портах ниже # 1024, добавьте перед sudo (за которым следует пробел).

Флаг -n предназначен для отображения IP-адресов вместо имен хостов. Это заставляет команду выполняться намного быстрее, потому что поиск DNS для получения имен хостов может быть медленным (несколько секунд или минут для многих хостов).

Флаг -P предназначен для отображения необработанных номеров портов вместо разрешенных имен, таких как http, ftp, или более эзотерических имен служб, таких как dpserve, socalia.

Смотрите комментарии для получения дополнительных опций.

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

Чтобы убить PID:

sudo kill -9 <PID>
# kill -9 60401
person pts    schedule 12.12.2010
comment
Добавьте к этому префиксу sudo, чтобы увидеть процессы, которыми вы не владеете. - person Gordon Davisson; 12.12.2010
comment
на лев, работал с изменением sudo lsof -i TCP:$PORT | grep LISTEN - person dhaval; 17.08.2012
comment
В Mountain Lion вам не нужно grep: sudo lsof -iTCP:$PORT -sTCP:LISTEN - person Siu Ching Pong -Asuka Kenji-; 13.07.2013
comment
после стольких поисков этот лучший. люди, которые напрямую хотят скопировать команду, должны заменить $ PORT фактическим номером порта или определить переменную PORT, а также для нескольких портов, например: export PORT = 8080,4433; lsof -n -i4TCP: $ ПОРТ - person siddhusingh; 02.03.2014
comment
В моей OSX 10.9.2 он работает даже без предшествующего sudo. Можно попробовать, поскольку он позволяет запускать его без ввода пароля. :) - person Tom Fink; 12.03.2014
comment
Sudo не требуется, если исследуемый порт превышает 1024. - person stigkj; 04.04.2014
comment
Все три работают у меня на Sierra, но мне нужно было sudo даже для порта выше 1024 - возможно, это зависит от того, кто запускает процесс. - person mwfearnley; 30.10.2017
comment
@meagar - вы откатили мою правку, чтобы включить версию ОС. Фактически это было неверно или в чем была причина отката? Думаю, имеет смысл отметить, какие команды работают на каких версиях OS X, чтобы людям было проще найти подходящую команду. - person Per Lundberg; 16.02.2018
comment
после этого вы можете использовать kill -9 <the-f-ing-pid> для его устранения - person Zennichimaro; 05.03.2020
comment
Удобная однострочная команда для уничтожения процесса на TCP-порту read K_PORT; lsof -iTCP:$K_PORT -sTCP:LISTEN | tail -n 1 | awk '{ print $2 }' | xargs kill -9 - person Vasu Adari; 27.06.2020
comment
У меня ошибка: lsof: unacceptable port specification in: -i 4TCP - person Vedmant; 01.02.2021
comment
Вместо | grep LISTEN я рекомендую использовать sed, чтобы вы также могли видеть заголовки столбцов | sed -n '1p;/LISTEN/p' - person Jeff; 11.02.2021

Начиная со Snow Leopard, до Catalina и Big Sur, каждая версия 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 - довольно мощный инструмент, но, к сожалению, не очень удобный в использовании.

person Michał Kalinowski    schedule 04.05.2015
comment
Это происходит в моих точечных файлах. Я ищу каждые несколько месяцев и всегда нахожу ответ. - person danemacmillan; 09.05.2019
comment
Я считаю, что этот ответ должен быть принят, поскольку OP сказал, что он делает -pntl, в котором будут перечислены все службы. В принятом ответе предлагается указать один или несколько номеров порта, что удаленно отличается. - person seeafish; 07.11.2019

Вы также можете использовать:

sudo lsof -i -n -P | grep TCP

Это работает в Mavericks.

person Rog182    schedule 22.01.2014
comment
Параметр -i делает это значительно быстрее. 0,02 секунды против 2 секунд. В моем приложении это имело большое значение. - person Eric Boehs; 20.12.2014
comment
что делают эти конкретные флаги -i, -n, -P. Я нигде не могу найти, что именно они означают - person Chad Watkins; 30.04.2015
comment
sudo lsof -i -n -P | grep TCP | grep $ PORT - я создал псевдоним с помощью этой команды - person alyn000r; 01.08.2016
comment
Я бы предложил добавить | grep $ PORT или | grep СЛУШАТЬ - person KC Baltz; 31.05.2018
comment
Большой! Также работает в Мохаве. - person Gefilte Fish; 15.11.2018

Обновление, январь 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)
person arcseldon    schedule 07.01.2016
comment
Эта команда также отображает PID, не являющиеся слушателями, и вопросы, явно заданные только для слушателей. - person pts; 07.01.2016
comment
Вы также можете запустить lsof -t -i :1338. -t вернет идентификатор процесса, поэтому вам не придется выполнять awk / head. - person KFunk; 20.08.2016
comment
Ничего не работало кроме kill -9 $(lsof -t -i :5000) на el capitan - person goksel; 29.09.2016
comment
Отлично. Я предпочитаю знать, что там, прежде чем убить его, поэтому (исходя из этого) я просто добавил в свой bashrc: whatsonport() { ps -ef | grep `lsof -t -i :$1` }, так что: ⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node . - person Sigfried; 13.04.2017
comment
Спасибо, lsof -i :PORT_NUMBER сделал для меня работу. - person marika.daboja; 12.05.2020

Это работает в Mavericks (OSX 10.9.2).

sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN
person Charley Wu    schedule 12.05.2014
comment
10.10 мне не понадобился sudo. - person Sophistifunk; 19.02.2015
comment
Работал Йосемити (10.10.2) - person Phillip Kamikaze; 24.06.2015

Для портов 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. Хорошая сторона здесь в том, что sudo не требуется

netstat -a -n | grep 'LISTEN '

Объяснение используемых предметов:

-n подавить имя хоста

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

-P не указывать имена портов

-a [over netstat] для всех сокетов

-n [over netstat] не разрешать имена, показывать сетевые адреса в виде чисел

Проверено на High Sierra 10.13.3 и Mojave 10.14.3.

  • последний синтаксис netstat также работает в Linux
person PYK    schedule 08.12.2018
comment
Подробные объяснения на самом деле очень полезны для таких новичков, как я. спасибо @PYK - person Tomaz Wang; 29.05.2019

в OS X вы можете использовать параметр -v для netstat, чтобы указать связанный pid.

тип:

netstat -anv | grep [.]PORT

вывод будет выглядеть так:

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

PID - это число перед последним столбцом, в данном случае 3105.

person Sean Hamilton    schedule 03.11.2015
comment
Вам также необходимо добавить grep LISTEN, чтобы показывать только слушателей. - person pts; 07.01.2016
comment
Это то, что мне было нужно! lsof не смог найти порт. но netstat показал, что он был открыт. -v был секретным соусом, которого мне не хватало. - person Aaron McMillin; 29.11.2017

В 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, т.е. серверов

person johntellsall    schedule 14.01.2018
comment
флаг -v сделал это - person user9869932; 12.06.2018

В последней версии macOS вы можете использовать эту команду:

lsof -nP -i4TCP:$PORT | grep LISTEN

Если вам трудно запомнить, то, возможно, вам следует создать функцию bash и экспортировать ее с более удобным именем, например так

vi ~/.bash_profile

а затем добавьте в этот файл следующие строки и сохраните его.

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

Теперь вы можете ввести listening_on 80 в свой терминал и посмотреть, какой процесс прослушивает порт 80.

person arturgrigor    schedule 05.06.2018

В Snow Leopard (OS X 10.6.8) запуск man lsof дает:

lsof -i 4 -a

(фактический ручной ввод - 'lsof -i 4 -a -p 1234')

Предыдущие ответы не работали на Snow Leopard, но я пытался использовать netstat -nlp, пока не увидел использование lsof в ответе pts.

person Brent Self    schedule 25.08.2013

Я парень Linux. В Linux это очень просто с netstat -ltpn или любой комбинацией этих букв. Но в Mac OS X netstat -an | grep LISTEN это самое гуманное. Другие очень уродливы, и их трудно запомнить при поиске и устранении неисправностей.

person edib    schedule 17.08.2016
comment
Вопрос явно задан для конкретного порта TCP, и ваши команды показывают слушателей на всех портах. - person pts; 17.08.2016

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

Это показывает, кто чем занимается. Удалите -n, ​​чтобы увидеть имена хостов (немного медленнее).

person Misha Tavkhelidze    schedule 03.05.2014
comment
Ваш ответ неплох, но он касается вопроса, на который несколько лет назад было положено много голосов, и один из них был принят принятым. В будущем постарайтесь сосредоточиться на более свежих вопросах, особенно на тех, на которые еще нет ответа. - person ; 03.05.2014
comment
Отображает ли эта команда также порты не TCP и не прослушиватели? Вопрос явно запрашивает слушателей только на портах TCP. - person pts; 05.05.2014
comment
Согласно справочной странице lsof (8): If no address is specified, this option [-i] selects the listing of all Internet and x.25 (HP-UX) network files. - person Misha Tavkhelidze; 05.05.2014
comment
@ Миша Тавхелидзе: Значит, он также отображает тех, кто не слушает, поэтому не отвечает на вопрос. - person pts; 07.01.2016
comment
Добавить -sTCP:LISTEN в lsof - person Misha Tavkhelidze; 11.01.2016
comment
который показывает не только прослушиваемые порты, но и исходящие соединения? - person Motti Shneor; 18.05.2016

Это сделало то, что мне было нужно.

ps -eaf | grep `lsof -t -i:$PORT`
person Frank    schedule 10.05.2017

Я сделал небольшой скрипт, чтобы не только видеть, кто где слушает, но и отображать установленные связи и с какими странами. Работает на 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)

Это может быть полезно, чтобы проверить, подключены ли вы к Северной Корее! ;-)

person 0x00    schedule 03.07.2017
comment
Большой! Просто обновите его до ipstack (потому что freegeoip больше не существует) и используйте jp вместо grep для упрощения синтаксического анализа json. - person Robert Wildling; 30.12.2020

Вдохновленный пользователем Брент Селф:

lsof -i 4 -a | grep LISTEN

person Punnerud    schedule 01.01.2019

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

1. netstat -p tcp -p udp 

2. lsof -n -i4TCP -i4UDP 

Думал, что добавлю свой вклад, надеюсь, это может кому-то помочь.

person Boschko    schedule 13.01.2019

Это хороший способ для macOS High Sierra:

netstat -an |grep -i listen
person tr4nc3    schedule 15.08.2018
comment
Совершенно верно! Принятый ответ на самом деле правильный ... netstat в Mac OS X не показывает сопоставление pid с портом. - person tr4nc3; 09.01.2019