Einzeiler
Ich habe einen netten Einzeiler zusammengestellt, der schnell seinen Zweck erfüllt und es ermöglicht, eine beliebige Anzahl von Ports in einem beliebigen Bereich zu erfassen (hier ist er zur besseren Lesbarkeit in 4 Zeilen unterteilt):
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"
Zeile für Zeile
commist ein Dienstprogramm, das sortierte Zeilen in zwei Dateien vergleicht. Es gibt drei Spalten aus: Zeilen, die nur in der ersten Datei erscheinen, Zeilen, die nur in der zweiten erscheinen, und gemeinsame Zeilen. Durch die Angabe -23unterdrücken wir letztere Spalten und behalten nur die erste. Wir können dies verwenden, um die Differenz zweier Mengen zu erhalten, ausgedrückt als eine Folge von Textzeilen. Ich habe comm hier davon erfahren .
Die erste Datei ist der Portbereich, aus dem wir auswählen können. seqErzeugt eine sortierte Folge von Zahlen von $FROMbis $TO. Das Ergebnis wird commmithilfe der Prozessersetzung als erste Datei weitergeleitet .
Die zweite Datei ist die sortierte Liste von Ports, dass wir durch den Aufruf des erhaltenen ssBefehls (mit -tBedeutung TCP - Ports, -aalle Bedeutung - etabliert und zuhören - und -nnumerisch - versuchen Sie nicht zu lösen, sagen sie, 22zu ssh). Wir wählen dann nur die vierte Spalte mit aus awk, die die lokale Adresse und den Port enthält. Wir verwenden cut, um Adresse und Port mit dem :Trennzeichen zu teilen und nur das letztere zu behalten ( -f2). ssgib auch einen Header aus, den wir loswerden, indem wir grepnach nicht leeren Zahlenfolgen pingen, die nicht länger als 5 sind. Wir erfüllen dann die commAnforderung, indem wir sortnumerisch ( -n) und Duplikate mit loswerden uniq.
Jetzt haben wir eine sortierte Liste der offenen Ports, dass wir shuffle , um dann die ersten greifen "$HOWMANY"mit Einsen head -n.
Beispiel
Besorgen Sie sich die drei zufällig geöffneten Ports im privaten Bereich (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
könnte zum Beispiel zurückkehren
54930
57937
51399
Anmerkungen
- wechseln Sie
-tmit -uin ss, um stattdessen freie UDP-Ports zu erhalten.
- Lassen
shufSie es fallen, wenn Sie nicht an einem zufälligen Port interessiert sind