Чи є якась команда командного рядка чи інший спосіб знайти та перелічити зайняті та вільні номери портів на моїй машині Linux?
Чи є якась команда командного рядка чи інший спосіб знайти та перелічити зайняті та вільні номери портів на моїй машині Linux?
Відповіді:
Команда
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
Число після двокрапки в полі Місцева адреса показує порт, який використовується. Якщо стан "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.
-antu
може бути записаний як -tuna
🐟
Хороший і надійний спосіб перевірити наявність відкритих портів - це використання 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)
Інший спосіб:
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 )