Как узнать, какая программа прослушивает данный порт?

377

Я подозреваю, что программа прослушивает порт 8000на моей машине.

Когда я запускаю следующую команду, я получаю эту ошибку:

> python -m SimpleHTTPServer
# Lots of python error
socket.error: [Errno 98] Address already in use

Если я использую другой порт ( 8000по умолчанию), веб-сервер работает нормально.

Если я запускаю wget localhost:8000из командной строки, он возвращается 404 Not Found.

Что я могу сделать (или какие инструменты доступны), чтобы найти, какая программа прослушивает порт 8000и откуда она настроена?

yansal
источник

Ответы:

314

Откройте свой терминал и введите как

lsof -i :8000

эта команда выведет список приложений, используемых этим портом с PID. (Если результаты не выполняются, sudoтак как у вас могут не быть разрешения на определенные процессы.)

Например, с портом 8000 ( python3 -m http.server):

$ lsof -i :8000
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
python3 3269 user    3u  IPv4 1783216      0t0  TCP *:8000 (LISTEN)

И порт 22 (SSH):

$ sudo lsof -i :22
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd     998 root    3u  IPv4 1442116      0t0  TCP *:ssh (LISTEN)
sshd     998 root    4u  IPv6 1442118      0t0  TCP *:ssh (LISTEN)

Надеюсь, это поможет.

rɑːdʒɑ
источник
2
Это также работает на OSX для чего стоит .....
reevesy
2
Добавление -s TCP:LISTENограничивает результат фактическим сокетом прослушивания и его процессом.
Джерманн
1
Если вы ищете порт 8000, он возвращается PID 1889? Ват
CodyBugstein
Да, есть сервис с PID 1889 через порт 8881. Я что-то упустил?
rɑːdʒɑ
1
@ В примере показан поиск порта 8881. Столбец PID содержит идентификаторы процесса, а столбец NAME - порты.
Фрик де Брюин
377

Вы можете использовать netstat, чтобы увидеть, какой процесс прослушивает какой порт.

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

sudo netstat -peanut

если вам нужно точно знать, кто прослушивает порт 8000, вы можете использовать это:

sudo netstat -peanut | grep ":8000 "

Там нет процесса, который может скрыть от netstat.

Антуан Родригес
источник
117
netstat -peanutлегче запомнить, чем netstat -taupen!
Дуглас Б. Стейпл
9
Хороший ! - Просто отредактировал ответ, чтобы отразить ваш комментарий. Спасибо.
Антуан Родригес
2
'fuser -k 8000 / tcp', чтобы освободить этот порт
Джей Моди
3
если в столбце «PID / Название программы» вместо имени процесса вы видите тире, то забыли добавить «sudo»
v.shashenko
3
так что это арахис да
пруссван
172

Чтобы разъяснить ответ по @ 33833, вы можете получить очень подробную информацию, например:

$ lsof -i :8000
COMMAND  PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
squid3  1289 proxy   15u  IPv6 14810490      0t0  TCP *:8000 (LISTEN)

$ ps -fp 1289
UID        PID  PPID  C STIME TTY          TIME CMD
proxy     1289     1  0 09:48 ?        00:00:00 /usr/sbin/squid3 -N -f /etc/squid-deb-proxy/squid-deb-proxy.conf

Я сразу вижу, что squid - это процесс, но на самом деле мой squid-deb-proxyзахватывает порт.

Еще один хороший пример Java-приложения:

$ lsof -i :4242
COMMAND  PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java    3075 root   86u  IPv4    12019      0t0  TCP *:4242 (LISTEN)

$ ps -fp 3075
UID        PID  PPID  C STIME TTY          TIME CMD
root      3075     1 15 May24 ?        3-16:07:25 /usr/local/crashplan/jre/bin/java -Dfile.encoding=UTF-8 -Dapp=CrashPlanService -DappBaseName=CrashPl

В lsof(LiSt Open Files) вы можете видеть, что это Java, что менее чем полезно. Запустив psкоманду с PID, мы сразу увидим, что это CrashPlan.

Эндрю Бернс
источник
9
В одной команде:lsof -t -i :8000 | xargs ps -fp
Бретт Y
8
Я должен был префикс, sudo но после этого он работал для меня. Благодарю.
Дуэйн Крукс
4
примечание: без sudoошибки вы не получите, вы просто ничего не получите в ответ.
Франк
13

Попробуйте ssиз iproute2пакета:

ss -nlp | grep 8000
korjjj
источник
5
ssтакже имеет свои собственные возможности фильтрации: ss -nlp '( sport = :8000 )'.
GnP
6

Еще один способ использования socklistиз procinfoпакета:

man socklist

DESCRIPTION
socklist- это скрипт Perl, который выдает список всех открытых сокетов, перечисляет типы, порт, inode, uid, pid, fd и программу, которой он принадлежит.

sudo socklist

type  port      inode     uid    pid   fd  name
tcp     53      28749       0   1721    5  dnsmasq
tcp    631      29190       0   2433   11  cupsd
tcp  42376      82230    1000   1345   84  firefox
tcp  49048      71686    1000   1345   67  firefox
tcp  41248      81672    1000   1345  119  firefox
tcp  54676      84558    1000   1345   73  firefox
udp  56107      66258       0   3268   20  dhclient
udp  40804      17857     107    679   14  avahi-daemon
udp     53      28748       0   1721    4  dnsmasq
udp     68      67427       0   3268    6  dhclient
udp    631      19692       0    765    8  cups-browsed
udp   5353      17855     107    679   12  avahi-daemon
user.dz
источник
2

Вы можете использовать Nmap.

Очень важно знать, какие порты открыты на вашем ПК, это полезно не только для Linux, но и для других операционных систем, в Linux есть много инструментов для проверки того, какие порты открыты, наиболее распространенным является nmap, который является инструмент командной строки, но также существует графический интерфейс для него, если вы предпочитаете этот путь. 1

чтобы установить его, просто нажмите Ctrl+ Alt+ Tна клавиатуре, чтобы открыть терминал. Когда он откроется, выполните команду ниже:

sudo apt-get install nmap

Для получения дополнительной информации о nmap и других утилитах, перейдите сюда

1 Источник: garron.me

Митч
источник
Nmap только скажет вам, что порт открыт, а не какой процесс его открыл.
Эндрю Бернс
1
Я нажал на ваш источник, чтобы прочитать [nmap] tries to guess which service is listening on each port, but it can make mistakesпрямо перед тем, как он предложит реальный метод, чтобы выяснить, какому процессу принадлежит сокет.
GnP
@gnp Вы также можете взглянуть на это .
Митч
@ Митч, я сделал. ОП должен знать точный PID процесса в локальной системе. Nmap здесь не тот инструмент, даже с сервисом и определением версии. Либо он будет соответствовать элементу в базе данных nmaps, который по-прежнему позволяет OP в темноте выяснить, какой процесс нужно убить или перенастроить, либо не будет, и у OP будет хороший отпечаток и ссылка на
insecure.org