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") \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -n | uniq) \
| shuf | head -n "$HOWMANY"
Linea per linea
comm
è un'utilità che confronta le righe ordinate in due file. 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 reindirizzato al comm
primo file utilizzando 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 sbarazziamo tramite grep
ping per sequenze di numeri non vuote che non sono più lunghe di 5. Rispettiamo quindi comm
il requisito sort
inserendo numericamente ( -n
) e sbarazzandoci dei duplicati uniq
.
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) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort | uniq) | shuf | head -n 3
potrebbe tornare ad esempio
54930
57937
51399
Gli appunti
- passare
-t
con -u
in ss
per ottenere invece le porte UDP gratuite.
- rilasciare
shuf
se non sei interessato ad afferrare una porta casuale