Кто прослушивает данный TCP-порт в Mac OS X?
в Linux я могу использовать netstat -pntl | grep $PORT
или fuser -n tcp $PORT
чтобы узнать, какой процесс (PID) прослушивает указанный TCP-порт. Как получить ту же информацию о Mac OS X?
14 ответов
на macOS High Sierra используйте следующую команду:
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
.
дополнительные параметры см. В комментариях.
С Йосемити (10.10), до высокой Сьерра (10.13), каждая версия macOS поддерживает это:
sudo lsof -iTCP -sTCP:LISTEN -n -P
Обновление Январь 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 ; }' | head -n 2 | grep -v PID
быстрая иллюстрация:
для полноты, потому что часто используется вместе:
чтобы убить PID:
kill -9 <PID>
# kill -9 60401
или как один лайнер:
kill -9 $(lsof -t -i :1337)
в OS X вы можете использовать опцию-v для netstat, чтобы дать связанный pid.
тип:
netstat -anv | grep [.]PORT
вывод будет выглядеть следующим образом:
tcp46 0 0 *.8080 *.* LISTEN 131072 131072 3105 0
PID-это число перед последним столбцом, 3105 для этого случая
на 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
- дайте информацию только для портов в режиме прослушивания, т. е. серверов
на 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.
в последней версии macOS вы можете использовать эту команду:
lsof -nP -i4TCP:$PORT | grep LISTEN
Если вам трудно вспомнить, то, возможно, вам следует создать bash
функция и экспортировать его с более дружелюбным именем, как так
vi ~/.bash_profile
а затем добавьте следующие строки в этот файл и сохраните его.
function listening_on() {
lsof -nP -i4TCP:"" | grep LISTEN
}
теперь вы можете типа listening_on 80
в вашем терминале и посмотреть, какой процесс прослушивает порт 80
.
Я парень Linux. В Linux это очень легко с netstat -ltpn
или любая комбинация этих букв. Но в Mac OS X netstat -an | grep LISTEN
самый гуманный. Другие очень уродливы и очень трудно запомнить при устранении неполадок.
lsof -n -i | awk '{ print ,; }' | sort -u
Это показывает, кто что делает. Удалите -n, чтобы увидеть имена хостов (немного медленнее).
Я сделал небольшой скрипт, чтобы увидеть не только кто слушает, где, но и отображать установленные соединения и в какие страны. Работает на 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)
Это может быть полезно, чтобы проверить, если вы подключены к Северной Корее! ;-)