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
comm
ist 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 -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 comm
mithilfe der Prozessersetzung als erste Datei weitergeleitet .
Die zweite Datei ist die sortierte Liste von Ports, dass wir durch den Aufruf des 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
numerisch ( -n
) und Duplikate mit loswerden uniq
.
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) <(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
-t
mit -u
in ss
, um stattdessen freie UDP-Ports zu erhalten.
- Lassen
shuf
Sie es fallen, wenn Sie nicht an einem zufälligen Port interessiert sind