27

Есть ли какая-либо команда командной строки или какой-либо другой способ найти и перечислить занятые и свободные номера портов на моем компьютере с Linux?

4 ответа4

41

Команда

netstat -antu

покажет все используемые порты tcp и udp. Вывод будет выглядеть примерно так:

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:59753           0.0.0.0:*               LISTEN

Число после двоеточия в поле Local Address указывает используемый порт. Если состояние "LISTEN", это означает, что порт используется для входящих соединений. Если IP-адрес в поле « Local Address равен 0.0.0.0 это означает, что входящие соединения будут приниматься на любой IP-адрес, назначенный интерфейсу, то есть это означает, что соединения исходят за пределы вашей машины.

Если бы он сказал localhost или 127.0.0.1 он принимал бы только соединения с вашей машины.

Кроме того, если вы добавите параметр -p и запустите его от имени пользователя root, он покажет процесс, который открыл порт:

$ sudo netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:59753           0.0.0.0:*               LISTEN      860/rpc.statd

Все, что не показано как используемое, является бесплатным, однако пользователи (непривилегированные учетные записи) могут открывать только порты выше 1023.

12

Я сам составил небольшой список .

Некоторые из моих любимых:

netstat -tulpn
lsof -i -n -P
7

Хороший и надежный способ проверки открытых портов - использование ss (замена устаревшего netstat), его можно использовать в скрипте, не требуя повышенных привилегий (например, sudo).

Использование: опция -l для прослушивающих портов, опция -n для обхода разрешения DNS и фильтр на исходном порту NN: src :NN (замените NN на порт, который вы хотите отслеживать). Для получения дополнительной информации см. man ss

ss -ln src :NN

Примеры:

[user@server ~]# ss -ln src :80
State       Recv-Q Send-Q       Local Address:Port   Peer Address:Port
LISTEN      0      128                      *:80                *:*
[user@server ~]# ss -ln src :81
State       Recv-Q Send-Q       Local Address:Port   Peer Address:Port

И в скрипте, используя grep, мы можем проверить, содержит ли вывод запрашиваемый порт. Пример с портом 80 в использовании (см. Выше):

myport=80
# count the number of occurrences of port $myport in output: 1= in use; 0 = not in use
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 80 is in use (result == 1)

Пример с портом 81 не используется (см. Выше)

myport=81
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 81 is NOT in use (result == 0)
3

По-другому:

telnet localhost <PORT_NUMBER>

Если порт свободен, вы получите ошибку. Если порт используется, telnet подключится.

(находится на http://www.unix.com/unix-for-dummies-questions-and-answers/8456-how-know-whether-particular-port-number-free-not.html)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .