Три варианта перечисления открытых портов предлагаются в jsh whatisonport
:
netstat -anp --numeric-ports | grep ":${PORT}\>.*:"
fuser -v "${PORT}"/tcp
lsof -P -S 2 -i "tcp:${PORT}" | grep "\(:${PORT}->.*:\|:$PORT (LISTEN)$\)"
Я предпочитаю netstat
, потому что он быстрый, краткий и может перечислить порты, открытые другими пользователями. (Хотя для перечисления имен и PID таких процессов по-прежнему потребуются привилегии суперпользователя / пользователя.)
$ netstat -anp --numeric-ports | grep ":80\>.*:"
tcp6 0 0 :::80 :::* LISTEN 1914/apache2
$ fuser -v "80/tcp"
USER PID ACCESS COMMAND
80/tcp: root 1914 F.... apache2
www-data 12418 F.... apache2
...
$ lsof -P -S 2 -i "tcp:80" | grep "\(:80->.*:\|:80 (LISTEN)$\)"
apache2 1914 root 4u IPv6 11920 0t0 TCP *:80 (LISTEN)
apache2 12418 www-data 4u IPv6 11920 0t0 TCP *:80 (LISTEN)
...
Использование grep
в двух случаях должно соответствовать только порту на локальном компьютере. стороне и пропускать открытые соединения с удаленным портом 80. (Альтернативой может быть использование -l
с netstat
или с lsof
для использования -sTCP: LISTEN
, но мне нравятся приведенные выше команды greps, потому что они также ловят исходящие соединения от данного порта, что иногда может представлять интерес.)
With lsof
мы используем -P
для отображения : 80
вместо : http
, чтобы сделать возможным использование grep. Параметр -S 2
заставляет lsof
выполнять своевременное завершение.
Предполагая, что мы хотим использовать netstat
, мы могли бы получить PID следующим образом:
$ netstat -anp --numeric-ports | grep ":80\>.*:" | grep -o "[0-9]*/" | sed 's+/$++'
1914
...
И мы могли бы даже передать эти PID в kill
:
... | xargs -d '\n' kill -KILL
Однако часто существует вероятность ложного срабатывания при использовании регулярных выражений, поэтому я бы рекомендовал просто посмотреть на исходный результат netstat
, а затем вручную решить, запускать или нет:
$ kill -KILL 1914
] У меня есть еще один скрипт под названием listopenports
, который может быть интересен.