2011-12-23 12:49:28 +0000 2011-12-23 12:49:28 +0000
31
31

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

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

Ответы (4)

42
42
42
2011-12-23 13:11:39 +0000

Команда

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.

13
13
13
2012-10-12 06:02:01 +0000

Я составил [ маленький список ]0x3 и сам.

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

netstat -tulpn
lsof -i -n -P
7
7
7
2015-11-23 15:35:42 +0000

Хорошим и надежным способом проверки открытых портов является использование ss (замена для deprecated 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
3
3
2014-06-30 08:25:41 +0000

Другой способ:

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 ).

Похожие вопросы

6
10
7
5
3