Jednowarstwowa
Stworzyłem ładny jednowarstwowy, 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):
comm -23 \
<(seq "$FROM" "$TO" | sort) \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -u) \
| shuf | head -n "$HOWMANY"
Linia po linii
comm
to narzędzie, które porównuje linie w dwóch plikach, które muszą pojawiać się posortowane alfabetycznie. 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 tego użyć, 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 sortowany alfabetycznie (zamiast numerycznie) i przesyłany do comm
pierwszego pliku za pomocą 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
na ssh
). Następnie wybieramy tylko czwartą kolumnę awk
, która zawiera adres lokalny i port. Używamy cut
do dzielenia adresu i portu za pomocą :
separatora i zatrzymywania tylko tego ostatniego ( -f2
). ss
wypisujemy również nagłówek, którego pozbywamy się przez grep
ping dla niepustych ciągów liczb, które nie są dłuższe niż 5. Następnie spełniamy comm
wymaganie poprzez sort
ing bez duplikatów -u
.
Teraz mamy posortowaną listę otwartych portów, które możemy shuf
FLE aby następnie chwycić pierwsze "$HOWMANY"
te z head -n
.
Przykład
Chwyć trzy losowe otwarte porty z zakresu prywatnego (49152-65535)
comm -23 <(seq 49152 65535 | sort) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort -u) | shuf | head -n 3
może na przykład wrócić
54930
57937
51399
Notatki
- przełączyć
-t
z -u
IN ss
aby uzyskać bezpłatne porty UDP zamiast.
- wymienić
shuf
ze sort -n
jeśli wolisz, aby uzyskać dostępne porty numerycznie posortowane zamiast losowo
-n
do netstat i bardziej selektywnego grep). Można to zrobić, próbując otworzyć port w dowolnym trybie, którego potrzebujesz, i wypróbować inny, jeśli nie jest dostępny.