Я подозреваю, что программа прослушивает порт 8000
на моем компьютере.
Когда я запускаю следующую команду, я получаю эту ошибку:
> python -m SimpleHTTPServer
# Lots of python error
socket.error: [Errno 98] Address already in use
Если я использую другой порт (по умолчанию 8000
), веб-сервер работает нормально.
Если я запускаю wget localhost:8000
из командной строки, он возвращает 404 Not Found
.
Что я могу сделать (или какие инструменты доступны), чтобы узнать, какая программа прослушивает порт 8000
и откуда она настроена?
Откройте терминал и введите
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)
Надежда, которая помогает.
Чтобы разъяснить ответ по @ 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.
Вы можете использовать netstat, чтобы увидеть, какой процесс прослушивает какой порт.
Вы можете использовать эту команду, чтобы получить полную информацию:
sudo netstat -peanut
, если вам нужно точно знать, кто прослушивает порт 8000, вы можете использовать это:
sudo netstat -peanut | grep ":8000 "
Там нет процесса, который может скрыть от netstat.
Можно использовать nmap.
Действительно важно знать, какие порты открыты в Вашем ПК, это не только полезно для Linux, но также и для других операционных систем, Linux имеет много инструментов для проверки, какие порты открыты, наиболее распространенным является nmap, который является инструментом командной строки, но также и существуйте Графический frontEnd для него, если Вы предпочитаете тот путь 1
для установки его просто нажмите Ctrl+Alt+T на клавиатуре для открытия Terminal. Когда это откроется, выполните команду ниже:
sudo apt-get install nmap
Для получения дополнительной информации о nmap и других утилитах, идут Сюда
Другой способ использования socklist
из пакета procinfo
:
ОПИСАНИЕ
blockquote>
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
Из-за низкой позиции сообщества я не могу здесь комментировать.
Без sudo
все вышеперечисленные команды не предоставят вам идентификатор процесса / имя программы.
Итак, вам нужно ввести следующее:
sudo lsof -i :8000
или
sudo netstat -lntup
вы можете проверить эти данные команды через man
, help
или мой любимый помощник
Вот простая для запоминания команда
ss -townlup
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
icmp6 UNCONN 0 0 *%eth0:58 *:*
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:*
udp UNCONN 0 0 172.31.26.71%eth0:68 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:443 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
tcp LISTEN 0 128 [::]:443 [::]:*
tcp LISTEN 0 100 *:9090 *:* users:(("java",pid=13008,fd=16))
tcp LISTEN 0 100 *:8080 *:* users:(("java",pid=11556,fd=12))