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

Jak mogę sprawdzić, które porty są zajęte, a które wolne na mojej maszynie z Linuxem?

Czy istnieje jakaś komenda wiersza poleceń lub inny sposób na znalezienie i wylistowanie zajętych i wolnych numerów portów na mojej maszynie z Linuxem?

Odpowiedzi (4)

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

Komenda

netstat -antu

pokaże wszystkie używane porty tcp i udp. Wyjście będzie wyglądało mniej więcej tak:

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

Liczba po dwukropku w polu Local Address pokazuje używany port. Jeśli stan to “LISTEN” oznacza to, że port jest używany dla połączeń przychodzących. Jeśli adres IP w polu Local Address ma wartość 0.0.0.0 oznacza to, że połączenia przychodzące będą akceptowane na każdym adresie IP przypisanym do interfejsu - oznacza to więc połączenia pochodzące spoza twojego komputera.

Gdyby w polu localhost lub 127.0.0.1 było napisane -p oznaczałoby to, że akceptowane będą tylko połączenia z Twojego komputera.

Dodatkowo, jeśli dodasz parametr 0x6& i uruchomisz go jako root, pokaże on proces, który otworzył port:

$ 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

Wszystko co nie jest pokazane jako używane jest wolne, jednak użytkownicy (konta nieuprzywilejowane) mogą otwierać tylko porty powyżej 1023.

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

Stworzyłem małą listę sam.

Niektóre z moich ulubionych to:

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

Dobrym i niezawodnym sposobem na sprawdzenie otwartych portów jest użycie ss (zamiennik dla przestarzałego netstat), jest to możliwe do użycia w skrypcie bez konieczności posiadania podwyższonych uprawnień (tj. sudo).

Użycie: opcja -l dla portów nasłuchujących, opcja -n do ominięcia rozdzielczości DNS, oraz filtr na porcie źródłowym NN: src :NN (zastąp NN przez port, który chcesz monitorować). Więcej opcji znajdziesz w rozdziale man ss

ss -ln src :NN

Przykłady:

[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

I w skrypcie, używając grep, możemy sprawdzić, czy wyjście zawiera port, o który prosiliśmy. Przykład z używanym portem 80 (patrz wyżej):

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)

Przykład z nieużywanym portem 81 (patrz wyżej)

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

Inny sposób:

telnet localhost <PORT_NUMBER>

Jeśli port jest wolny otrzymasz błąd. Jeśli port jest w użyciu telnet połączy się.

(znalezione na http://www.unix.com/unix-for-dummies-questions-and-answers/8456-how-know-whether-particular-port-number-free-not.html )