Ich suche nach einem Befehl oder Skript, das einen nicht verwendeten Port auf meinem Ubuntu-Linux-System zurückgibt. Ich habe im Internet nachgesehen und das einzige, was ich finde, ist der verwendete / Listen-Port mit dem nestat-Befehl. Anscheinend funktioniert etwas mit dem Befehl netstat, weiß aber nicht genau was. Irgendeine Idee wie?
Vielen Dank.
linux
command-line
port
user2429082
quelle
quelle
Antworten:
netstat -lat
Gibt die vollständige Liste der empfangsbereiten und eingerichteten Ports an.Wenn sich kein Port in einem dieser Zustände befindet, existiert für das System kein Befehl, der die Liste der nicht verwendeten Ports anzeigt.
Denken Sie daran, dass es 65535 Ports gibt, also ist alles, was nicht aktiviert
netstat -lat
ist, ein unbenutzter Port.Das folgende Bash-Skript führt einen einfachen Scan der TCP- Ports durch und teilt Ihnen mit, welche geöffnet und welche geschlossen sind :
Wenn Sie es als speichern portscan.sh dann muss es laufen als ./portscan.sh IP first_port last_port , zum Beispiel:
./portscan 127.0.0.1 20 135
die lokale Ausrüstung von Häfen 20-135 scannenquelle
Ruby 2.x (Einzeiler):
ruby -e 'require "socket"; puts Addrinfo.tcp("", 0).bind {|s| s.local_address.ip_port }'
Auf meinem Computer, auf dem gerade gedruckt wurde:
Ein nachfolgender Aufruf wurde gedruckt:
Diese Technik bewirkt, dass der aktuelle Benutzer einen nicht verwendeten Port anfordert (an Port "0" binden) und dann die vom Betriebssystem bereitgestellte Portnummer ausgibt. Und da der aktuelle Benutzer fragt, werden Ports unter 1024 nicht zurückgegeben (es sei denn, der aktuelle Benutzer ist root).
Kredit wo Kredit fällig ist - diese Lösung stammt aus einem Kommentar von Franklin Yu auf unix.stackexchange.com .
quelle
Kurzes Bash-Skript, das zufällig eine Zahl zwischen 1025 und 60000 generiert und eine Schleife durchläuft, bis diese Zahl nicht mehr in der Liste der verwendeten Ports gefunden wird. Dies ist eine schnelle und schmutzige Lösung, die sich auf größere Ports konzentriert:
quelle
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):
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 habecomm
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 wirdcomm
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
zussh
). Wir wählen dann nur die vierte Spalte mit ausawk
, die die lokale Adresse und den Port enthält. Wir verwendencut
, 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 wirgrep
nach nicht leeren Zahlenfolgen pingen, die nicht länger als 5 sind. Wir erfüllen dann diecomm
Anforderung, indem wirsort
numerisch (-n
) und Duplikate mit loswerdenuniq
.Jetzt haben wir eine sortierte Liste der offenen Ports, dass wir
shuf
fle , um dann die ersten greifen"$HOWMANY"
mit Einsenhead -n
.Beispiel
Besorgen Sie sich die drei zufällig geöffneten Ports im privaten Bereich (49152-65535)
könnte zum Beispiel zurückkehren
Anmerkungen
-t
mit-u
inss
, um stattdessen freie UDP-Ports zu erhalten.shuf
Sie es fallen, wenn Sie nicht an einem zufälligen Port interessiert sindquelle
Ich musste nur einen zufälligen unbenutzten Port finden und keine Liste von ihnen drucken. Hier ist meine Bash-Lösung.
Und nutzen Sie es durch Beschaffung
quelle
Vielleicht eine andere Lösung basierend auf der Liste der verwendeten Ports:
Der
netstat
Befehl generiert eine Liste aller offenen Ports. Dersed
Befehl extrahiert die verwendeten Portnummern und dassort
/uniq
-Konstrukt gibt eine eindeutige Liste der offenen Ports zurück. Der zweite Schritt besteht darin, eine Liste von Portnummern zu erstellen, die bei 1 beginnen und bei 1000 enden (reservierte Ports), sowie eine zusätzliche Liste aller Portnummern, die bei 1 bis 65535 beginnen. Die endgültige Liste enthält alle verfügbaren Ports nur einmal unduniq -u
extrahiert sie . Zuletztshuf -n 1
wählt der einen zufälligen Port aus der vollständigen Liste der verfügbaren Ports aus. Trotzdem wird es eine Rennbedingung geben, bevor man den Hafen reservieren kann.quelle
Ich musste den nächsten offenen Port ausgehend von einer Portnummer finden. Hier ist mein Versuch, die @ Taras-Lösung zu verwenden.
quelle
Wenn 54321 Ihr Port ist, führen Sie Folgendes aus:
Einige Variationen der Verwendung von netstat finden Sie hier .
quelle