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" | sort) \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -u) \
| shuf | head -n "$HOWMANY"
Zeile für Zeile
commist ein Dienstprogramm, das Zeilen in zwei Dateien vergleicht, die alphabetisch sortiert angezeigt werden müssen. 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 alphabetisch (anstatt numerisch) sortiert und commals erste Datei mithilfe der Prozessersetzung weitergeleitet .
Die zweite Datei ist die sortierte Liste von Ports, dass wir durch den Aufruf den 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 sortohne Duplikate arbeiten -u.
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 | sort) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort -u) | 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.
- Ersetzen Sie
shufdurch, sort -nwenn Sie verfügbare Ports nicht zufällig, sondern numerisch sortiert erhalten möchten
-nzu Netstat und einem selektiveren Grep). Versuchen Sie, einen Port in dem von Ihnen benötigten Modus zu öffnen, und versuchen Sie es mit einem anderen, falls dieser nicht verfügbar ist.