Comment créer un listener TCP?


40

Introduction: J'ai créé une fonction bash capable de vérifier si un port est disponible et l'incrémente de 1 si elle est fausse jusqu'à un certain numéro de port maximum. Par exemple, si le port 500 est indisponible, la disponibilité de 501 sera vérifiée jusqu’à 550.

Objectif: Afin de tester cette fonction bash, je dois créer une gamme de ports à l'état LISTEN.

Tentatives: Sous Windows, il est possible de créer un port LISTEN à l’aide des commandes PowerShell suivantes :

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>

Sur cette base, j'essayais de penser à une commande qui pourrait faire la même chose sur CentOS, mais je ne sais pas pourquoi et j'ai commencé à utiliser Google sans trouver de solution permettant de résoudre ce problème.

Réponse attendue : j'accepterai la réponse contenant une commande capable de créer un port LISTEN et, une fois la commande exécutée, le port devrait rester à l'état LISTEN, c'est-à-dire:

[user@host ~]$ ss -nat | grep 500
LISTEN     0      128                       *:500                       *:*

Remarque: il est possible de trouver les ports d’écoute sans passer par toute cette danse. Sous Linux: netstat -an --tcp | awk '/LISTEN/ {sub(".*:", "", $4); print $4}' | sort -nu. Sur * BSD: netstat -an -f inet -p tcp | awk '/LISTEN/ {sub(".*\\.", "", $4); print $4}' | sort -nu.
lcd047

Réponses:


40

Vous pouvez utiliser nc -lcomme méthode pour faire ce que vous recherchez. Certaines implémentations de ncont une -Loption qui permet aux connexions de persister.

Si vous n'en avez besoin que pendant un petit moment, vous pouvez ouvrir cette commande en forboucle et ouvrir un grand nombre de ports de cette façon.

Si vous avez besoin d'ouvrir plus longtemps, vous pouvez utiliser l'un des super serveurs pour créer un démon.


1
Au lieu de -Lje suggère: -k, --keep-openaccepter plusieurs connexions en mode écoute
Manuel Durando

37

vous pouvez créer un port d'écoute à l'aide de Netcat.

root@ubuntu:~# nc -l 5000

vous pouvez également vérifier si le port est ouvert ou non à l'aide de la commande netstat.

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

vous pouvez aussi vérifier avec nc:

Écouteur Netcat Server:

nc -l localhost 5000

Client Netcat:

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

si le port n'est pas ouvert

root@vm-ubuntu:~# nc -v localhost 5000
nc: connect to localhost port 5000 (tcp) failed: Connection refused

4
Je devais spécifier le port avec -pou cela ne fonctionnait pas:nc -l -p 1234
Leahkim

nc -l 12345 a travaillé à ubuntu 16.04
yuen shi

Pour ceux avec /bin/nc --> nc.traditional(par exemple, debian), utilisez l' -poption, comme @Leahkim l'a conseillé ci-dessus.
ankostis

6

Écoutez en utilisant netcat.

# nc -l 5555

Vérifier en utilisant ss

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

0

Notez que le netcatpaquet Debian a une implémentation différente où (au moins) vous devez fournir le port via l' -poption et l' -koption ne fonctionne pas. Vous pouvez rencontrer ce problème en utilisant Docker.

sudo apt install -y netcat

nc -l -p 1337

Vous pouvez envisager d'utiliser à la openbsd-netcatplace où l' -koption fonctionne.


0

Le code python ci-dessous est utile pour ouvrir un port factice

'' 'Serveur de socket simple utilisant des threads' '' importation de sockets import sys HOST = '' # Nom symbolique, signifiant toutes les interfaces disponibles PORT = 5500 # Port non privilégié arbitraire s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) print 'Socket created'

Lier le socket à l'hôte local et au port

try: s.bind ((HOST, PORT)) sauf socket.error en tant que msg: print 'La liaison a échoué. Code d'erreur: '+ str (msg [0]) +' Message '+ msg [1] sys.exit () print' Socket bind complete '

Commencer à écouter sur la prise

s.listen (10) print 'Socket now listening'

maintenant continue à parler avec le client

tandis que 1: # attend pour accepter une connexion - blocage de la communication, addr = s.accept () print 'Connecté avec' + addr [0] + ':' + str (addr [1]) s.close ()

Enregistrez le fichier et exécutez-le avec la commande python comme indiqué ci-dessous.

~] # python portlistener.py Socket créé Socket bind Socket complet Socket en cours d'écoute

Ensuite, vous pouvez vérifier à partir de la machine requise.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.