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
comm
ist 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 -23
unterdrü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. seq
Erzeugt eine sortierte Folge von Zahlen von $FROM
bis $TO
. Das Ergebnis wird alphabetisch (anstatt numerisch) sortiert und comm
als erste Datei mithilfe der Prozessersetzung weitergeleitet .
Die zweite Datei ist die sortierte Liste von Ports, dass wir durch den Aufruf den erhaltenen ss
Befehls (mit -t
Bedeutung TCP - Ports, -a
alle Bedeutung - etabliert und zuhören - und -n
numerisch - versuchen Sie nicht zu lösen, sagen sie, 22
zu 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
). ss
gib auch einen Header aus, den wir loswerden, indem wir grep
nach nicht leeren Zahlenfolgen pingen, die nicht länger als 5 sind. Wir erfüllen dann die comm
Anforderung, indem wir sort
ohne Duplikate arbeiten -u
.
Jetzt haben wir eine sortierte Liste der offenen Ports, dass wir shuf
fle , 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
-t
mit -u
in ss
, um stattdessen freie UDP-Ports zu erhalten.
- Ersetzen Sie
shuf
durch, sort -n
wenn Sie verfügbare Ports nicht zufällig, sondern numerisch sortiert erhalten möchten
-n
zu 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.