One-liner
Ho messo insieme un bel one-liner che serve rapidamente allo scopo, consentendo di afferrare un numero arbitrario di porte in un intervallo arbitrario (qui è diviso in 4 righe per la leggibilità):
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"
Linea per linea
comm
è un'utilità che confronta le righe in due file che devono apparire in ordine alfabetico. Produce tre colonne: linee che appaiono solo nel primo file, linee che appaiono solo nel secondo e linee comuni. Specificando -23
sopprimiamo le ultime colonne e conserviamo solo la prima. Possiamo usarlo per ottenere la differenza di due insiemi, espressa come una sequenza di righe di testo. Ho imparato comm
qui .
Il primo file è l'intervallo di porte che possiamo selezionare. seq
produce una sequenza ordinata di numeri da $FROM
a $TO
. Il risultato viene ordinato alfabeticamente (anziché numericamente) e convogliato comm
come primo file usando la sostituzione del processo .
Il secondo file è l'elenco ordinato delle porte, che otteniamo chiamando il ss
comando (con -t
significato porte TCP, che -a
significa tutto - stabilito e in ascolto - e -n
numerico - non tentare di risolvere, diciamo, 22
a ssh
). Selezioniamo quindi solo la quarta colonna con awk
, che contiene l'indirizzo e la porta locali. Usiamo cut
per dividere indirizzo e porta con il :
delimitatore e mantenere solo quest'ultimo ( -f2
). ss
emette anche un'intestazione, di cui ci liberiamo grep
eseguendo il ping per sequenze di numeri non vuote che non sono più lunghe di 5. Quindi rispettiamo comm
il requisito sort
ing senza duplicati -u
.
Ora abbiamo un elenco ordinato di porte aperte, che possiamo shuf
FLE per poi afferrare i primi "$HOWMANY"
quelli con head -n
.
Esempio
Prendi le tre porte aperte casuali nell'area privata (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
potrebbe tornare ad esempio
54930
57937
51399
Appunti
- passare
-t
con -u
in ss
per ottenere invece le porte UDP gratuite.
- sostituirlo
shuf
con sort -n
se si preferisce ottenere le porte disponibili ordinate numericamente anziché casualmente
-n
a netstat e un grep più selettivo). Il modo per farlo è provare ad aprire una porta in qualsiasi modalità sia necessaria e provarne un'altra se non è disponibile.