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):
comm -23 \
<(seq "$FROM" "$TO") \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -n | uniq) \
| shuf | head -n "$HOWMANY"
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 do comm
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
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 sekwencji liczb, które nie są dłuższe niż 5. Następnie spełniamy comm
wymaganie, sort
wpisując numerycznie ( -n
) i usuwając duplikaty uniq
.
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) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort | uniq) | shuf | head -n 3
może na przykład wrócić
54930
57937
51399
Uwagi
- przełączyć
-t
się -u
w ss
dostać darmowe porty UDP zamiast.
- upuść,
shuf
jeśli nie jesteś zainteresowany złapaniem losowego portu