Кто слушает данный порт TCP в Mac OS X? - PullRequest
1169 голосов
/ 12 декабря 2010

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

Ответы [ 17 ]

1757 голосов
/ 12 декабря 2010

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

lsof -nP -i4TCP:$PORT | grep LISTEN

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

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

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

Prepend sudo (после пробела), если вам нужна информация о портах ниже # 1024.

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

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

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

467 голосов
/ 04 мая 2015

Поскольку Snow Leopard (10.6), до Mojave (10.14) , каждая версия 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 - довольно мощный инструмент, но, к сожалению, он не так удобен в использовании.

420 голосов
/ 23 января 2014

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

sudo lsof -i -n -P | grep TCP

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

268 голосов
/ 07 января 2016

Обновление январь 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

Быстрая иллюстрация:

enter image description here

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

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

kill -9 <PID>
# kill -9 60401

или как один вкладыш:

kill -9 $(lsof -t -i :1337)
79 голосов
/ 12 мая 2014

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

sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN
37 голосов
/ 03 ноября 2015

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

Тип:

netstat -anv | grep [.]PORT

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

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

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

32 голосов
/ 15 января 2018

В macOS есть простой способ получить идентификатор процесса, который прослушивает определенный порт, с помощью netstat . Этот пример ищет процесс, обслуживающий контент через порт 80:

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

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

образец вывода

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

2-й из последнего столбца - PID. Выше это 715 .

опции

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

-n - показывать числа, не искать имена. Это делает команду много быстрее

-v - подробный вывод для получения идентификаторов процесса

-w - поиск слов. В противном случае команда вернет информацию для портов 8000 и 8001, а не только «80»

LISTEN - предоставлять информацию только для портов в режиме LISTEN, то есть для серверов

31 голосов
/ 08 декабря 2018

Для портов 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 suppressимя хоста

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

-P пропустить имена портов

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

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

Протестировано на High Sierra 10.13.3 и Мохаве 10.14.3

  • последний синтаксис netstat работает и на Linux

  • lsof вы можете попробовать через Debian: apt-get install lsof

18 голосов
/ 05 июня 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.

12 голосов
/ 25 августа 2013

На 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.

...