Szukam polecenia lub skryptu, który zwraca nieużywany port w moim systemie Ubuntu Linux. Zajrzałem do Internetu i jedyne, co znalazłem, to port używany / Listen z poleceniem nestat. Najwyraźniej coś z poleceniem netstat będzie działać, ale nie wiem co dokładnie. Masz pomysł jak?
Dzięki.
linux
command-line
port
użytkownik2429082
źródło
źródło
Odpowiedzi:
netstat -lat
podaje pełną listę nasłuchiwanych i ustanowionych portów.Gdy port nie znajduje się w żadnym z tych stanów, system nie istnieje, więc nie znajdziesz polecenia wyświetlającego listę nieużywanych portów.
Pamiętaj, że istnieje 65535 portów, więc wszystko, co nie
netstat -lat
jest włączone, jest nieużywanym portem.Poniższy skrypt bash wykona proste skanowanie portów TCP i poinformuje, które są otwarte, a które zamknięte :
Jeśli zapiszesz go jako portcan.sh , musisz go uruchomić jako ./portscan.sh IP pierwszy_port ostatni_port , na przykład:
./portscan 127.0.0.1 20 135
skanuje sprzęt lokalny z portów 20 do 135źródło
Ruby 2.x (jednowarstwowy):
ruby -e 'require "socket"; puts Addrinfo.tcp("", 0).bind {|s| s.local_address.ip_port }'
Na mojej maszynie w tej chwili wydrukowano:
Wydrukowano kolejne wezwanie:
Ta technika powoduje, że bieżący użytkownik żąda nieużywanego portu (powiązanie z portem „0”), a następnie drukuje numer portu podany przez system operacyjny. A ponieważ pyta obecny użytkownik, porty poniżej 1024 nie zostaną zwrócone (chyba że bieżący użytkownik = root).
Kredyt, na który przypadają kredyty - rozwiązanie pochodzi z komentarza Franklina Yu na unix.stackexchange.com Jaki jest najłatwiejszy sposób na znalezienie nieużywanego portu lokalnego?
źródło
Krótki skrypt bash, który losowo generuje liczbę od 1025 do 60000 i pętle, dopóki ta liczba nie zostanie znaleziona na liście używanych portów. To szybkie i brudne rozwiązanie ma tendencję do większych portów:
źródło
Jednowarstwowa
Stworzyłem ładny jednowierszowy, który szybko służy temu celowi, pozwalając złapać dowolną liczbę portów w dowolnym zakresie (tutaj jest podzielony na 4 linie dla czytelności):
Linia po linii
comm
to narzędzie, które porównuje posortowane linie w dwóch plikach. Wyprowadza trzy kolumny: linie, które pojawiają się tylko w pierwszym pliku, linie, które pojawiają się tylko w drugim, i linie wspólne. Określając-23
, pomijamy te ostatnie kolumny i zachowujemy tylko pierwszą. Możemy to wykorzystać, aby uzyskać różnicę dwóch zestawów, wyrażoną jako ciąg wierszy tekstu. Dowiedziałem sięcomm
tutaj .Pierwszy plik to zakres portów, które możemy wybrać.
seq
tworzy posortowaną sekwencję liczb od$FROM
do$TO
. Wynik jest przesyłany docomm
pierwszego pliku przy użyciu podstawienia procesu .Drugi plik to posortowana lista portów, którą uzyskujemy przez wywołanie
ss
polecenia (w-t
znaczeniu portów TCP,-a
co oznacza , że wszystkie - ustanowione i nasłuchujące - i-n
liczbowe - nie próbuj rozstrzygać, powiedzmy,22
nassh
). Następnie wybieramy tylko czwartą kolumnęawk
, która zawiera adres lokalny i port. Używamycut
do dzielenia adresu i portu za pomocą:
separatora i zatrzymywania tylko tego ostatniego (-f2
).ss
wypisujemy również nagłówek, którego pozbywamy się przezgrep
ping dla niepustych sekwencji liczb, które nie są dłuższe niż 5. Następnie spełniamycomm
wymaganie,sort
wpisując numerycznie (-n
) i usuwając duplikatyuniq
.Teraz mamy posortowaną listę otwartych portów, które możemy
shuf
FLE aby następnie chwycić pierwsze"$HOWMANY"
te zhead -n
.Przykład
Chwyć trzy losowe otwarte porty z zakresu prywatnego (49152-65535)
może na przykład wrócić
Uwagi
-t
się-u
wss
dostać darmowe porty UDP zamiast.shuf
jeśli nie jesteś zainteresowany złapaniem losowego portuźródło
Musiałem znaleźć tylko jeden losowy nieużywany port i nie wydrukować ich listy. Oto moje rozwiązanie bash.
I wykorzystaj go, zdobywając go
źródło
Być może inne rozwiązanie oparte na liście używanych portów:
netstat
Polecenie generuje listę wszystkich otwartych portów.sed
Polecenie wyodrębnia liczbie portów, które są używane orazsort
/uniq
powraca skonstruowania lista uniq otwartych portów. Drugim krokiem jest wygenerowanie listy numerów portów rozpoczynającej się od 1 i kończącej się na 1000 (porty zarezerwowane) oraz dodatkowej listy wszystkich numerów portów od 1 do 65535. Ostateczna lista zawiera wszystkie dostępne porty tylko raz iuniq -u
je wyodrębni . Na koniecshuf -n 1
wybierze jeden losowy port z pełnej listy dostępnych portów. Niemniej jednak będą istnieć warunki wyścigu, zanim będzie można zarezerwować port.źródło
Musiałem znaleźć następny otwarty port zaczynający się od numeru portu; oto moja próba użycia rozwiązania @Taras.
źródło
Jeśli 54321 jest twoim portem, uruchom:
Niektóre warianty korzystania z netstat można znaleźć tutaj .
źródło