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
commto 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ć. seqtworzy posortowaną sekwencję liczb od $FROMdo $TO. Wynik jest sortowany alfabetycznie (zamiast numerycznie) i przesyłany do commpierwszego pliku za pomocą podstawienia procesu .
Drugi plik to posortowana lista portów, którą uzyskujemy przez wywołanie sspolecenia (w -tznaczeniu portów TCP, -aco oznacza , że wszystkie - ustanowione i nasłuchujące - i -nliczbowe - nie próbuj rozstrzygać, powiedzmy, 22na ssh). Następnie wybieramy tylko czwartą kolumnę awk, która zawiera adres lokalny i port. Używamy cutdo dzielenia adresu i portu za pomocą :separatora i zatrzymywania tylko tego ostatniego ( -f2). sswypisujemy również nagłówek, którego pozbywamy się przez grepping dla niepustych ciągów liczb, które nie są dłuższe niż 5. Następnie spełniamy commwymaganie poprzez sorting bez duplikatów -u.
Teraz mamy posortowaną listę otwartych portów, które możemy shufFLE 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ć
-tz -uIN ssaby uzyskać bezpłatne porty UDP zamiast.
- wymienić
shufze sort -njeśli wolisz, aby uzyskać dostępne porty numerycznie posortowane zamiast losowo
-ndo 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.