Wie erstelle ich einen TCP-Listener?

40

Einführung: Ich habe eine Bash-Funktion erstellt, mit der überprüft werden kann, ob ein Port verfügbar ist, und die bis zu einer bestimmten maximalen Portnummer um 1 erhöht wird, wenn false. Wenn beispielsweise Port 500 nicht verfügbar ist, wird die Verfügbarkeit von 501 bis 550 überprüft.

Ziel: Um diese Bash-Funktion zu testen, muss eine Reihe von Ports erstellt werden, die sich im Status LISTEN befinden.

Versuche: Unter Windows ist es möglich, einen LISTEN-Port mit diesen PowerShell-Befehlen zu erstellen :

PS C:\Users\u> netstat -nat | grep 1234
PS C:\Users\u> $listener = [System.Net.Sockets.TcpListener]1234
PS C:\Users\u> $listener.Start();
PS C:\Users\u> netstat -nat | grep 1234
TCP    0.0.0.0:1234           0.0.0.0:0              LISTENING       InHost
PS C:\Users\u> $listener.Stop();
PS C:\Users\u> netstat -nat | grep 1234
PS C:\Users\u>

Auf dieser Grundlage habe ich versucht, über einen Befehl nachzudenken, der dasselbe auf CentOS ausführen kann, aber ich weiß nicht warum und habe mit Google begonnen, ohne eine Lösung zu finden, die dieses Problem löst.

Erwartete Antwort : Ich akzeptiere die Antwort mit einem Befehl, mit dem ein LISTEN-Port erstellt werden kann, und stimme ihr zu. Sobald der Befehl ausgeführt wurde, sollte der Port im LISTEN-Status bleiben, dh:

[user@host ~]$ ss -nat | grep 500
LISTEN     0      128                       *:500                       *:*
030
quelle
Nebenbei bemerkt: Es ist möglich, die Hörbuchsen zu finden, ohne den ganzen Tanz durchzugehen. Unter Linux: netstat -an --tcp | awk '/LISTEN/ {sub(".*:", "", $4); print $4}' | sort -nu. Ein * BSD: netstat -an -f inet -p tcp | awk '/LISTEN/ {sub(".*\\.", "", $4); print $4}' | sort -nu.
lcd047

Antworten:

40

Sie könnten nc -lals Methode verwenden, um das zu tun, wonach Sie suchen. Einige Implementierungen von nchaben eine -LOption, mit der die Verbindungen bestehen bleiben.

Wenn Sie sie nur für kurze Zeit benötigen, können Sie diesen Befehl in einer forSchleife öffnen und eine Reihe von Ports auf diese Weise öffnen.

Wenn Sie diese länger öffnen müssen, können Sie einen der Super-Server verwenden, um einen Daemon zu erstellen.

Dana Marble
quelle
1
Statt -Lwürde ich vorschlagen: -k, --keep-openakzeptieren mehrere Verbindungen im Modus hören
Manuel Durando
37

Sie können mit Netcat einen Port-Listener erstellen.

root@ubuntu:~# nc -l 5000

Sie können auch mit dem Befehl netstat prüfen, ob der Port geöffnet ist oder nicht.

root@vm-ubuntu:~# netstat -tulpen | grep nc
tcp        0      0 0.0.0.0:5000             0.0.0.0:*               LISTEN      0          710327      17533/nc

Sie können auch mit nc überprüfen:

Netcat Server Listener:

nc -l localhost 5000

Netcat Client:

root@vm-ubuntu:~# nc -v localhost 5000
Connection to localhost 5000 port [tcp/*] succeeded!

wenn der Port nicht offen ist

root@vm-ubuntu:~# nc -v localhost 5000
nc: connect to localhost port 5000 (tcp) failed: Connection refused
Sameh Ammar
quelle
4
Ich musste den Hafen mit angeben -poder es hat nicht funktioniert:nc -l -p 1234
Leahkim
nc -l 12345 arbeitete in Ubuntu 16.04
Yuen Shi
/bin/nc --> nc.traditionalVerwenden Sie für diejenigen mit (z. B. Debian) die -pOption, wie oben von @Leahkim empfohlen.
Ankostis
6

Hören Sie mit Netcat.

# nc -l 5555

Überprüfen Sie mit ss

# ss -nat|grep 5555
LISTEN     0      1                         *:5555                     *:*
#
Steve
quelle
0

Beachten Sie, dass das Debian- netcatPaket eine andere Implementierung hat, bei der Sie (zumindest) den Port über die -pOption bereitstellen müssen und die -kOption nicht funktioniert. Dieses Problem tritt möglicherweise mit Docker auf.

sudo apt install -y netcat

nc -l -p 1337

Sie können openbsd-netcatstattdessen verwenden, wo die -kOption funktioniert.

Das ist mein Design
quelle
0

Der folgende Python-Code ist hilfreich, um einen Dummy-Port zu öffnen

'' 'Einfacher Socketserver mit Threads' '' importieren Socket importieren sys HOST = '' # Symbolischer Name, dh alle verfügbaren Schnittstellen PORT = 5500 # Beliebiger nicht privilegierter Port s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) print 'Socket erstellt'

Binden Sie den Socket an den lokalen Host und den Port

versuche: an bind ((HOST, PORT)) außer socket.error als msg: print 'Bind fehlgeschlagen. Fehlercode: '+ str (msg [0]) +' Message '+ msg [1] sys.exit () print' Socket bind complete '

Hör auf die Buchse

s.listen (10) print 'Socket hört zu'

Sprechen Sie jetzt weiter mit dem Kunden

während 1: #warten, bis eine Verbindung akzeptiert wird - Anruf blockieren conn, addr = s.accept () print 'Verbunden mit' + addr [0] + ':' + str (addr [1]) s.close ()

Speichern Sie die Datei und führen Sie sie mit dem Python-Befehl wie unten gezeigt aus

~] # python portlistener.py Socket erstellt Socket binden abgeschlossen Socket hört jetzt zu

Dann können Sie von der erforderlichen Maschine überprüfen.

Rohit
quelle