Question Comportement de Netcat / Socat avec la canalisation et UDP?


Je suppose que c'est proche de linux - Netcat arrête d'écouter le trafic UDP - Super User, mais je pensais que je devrais demander quand même

Autant que versions de netcat J'utilise Ubuntu 11.04 et la valeur par défaut netcat sur ce que je devine est la openbsd un:

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

C'est ce que je trouve étrange: le premier cas fonctionne comme prévu - j'ouvre un serveur UDP dans un terminal:

$ sudo nc -ul 5000

... et dans un autre terminal je lance une nouvelle connexion client UDP - et je tape hello trois fois, en appuyant sur ENTER après chaque:

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

... et en revenant au terminal du serveur, il a imprimé hello trois fois, comme prévu:

$ sudo nc -ul 5000 
hello
hello
hello
^C

Jusqu'ici tout va bien, tout fonctionne comme prévu. Cependant, disons que j'essaie maintenant la même chose en injectant des données dans le client; alors établissez d'abord un serveur UDP dans un terminal:

$ sudo nc -ul 5000

... et dans un autre, insérer des données dans nc en tant que client UDP:

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

... après la commande client, le shell se bloque comme s'il attendait une entrée - hello et ENTREZ deux fois de plus; mais le serveur n'a enregistré que le premier hello (qui a été canalisé via echo). En outre, même si vous appuyez sur Ctrl-C et essayez de répéter le client echo hello | nc -u 127.0.0.1 5000 commande, le serveur va encore rester sur avoir signalé le tout premier hello:

$ sudo nc -ul 57130 
hello
^C

... et seulement après avoir arrêté le serveur avec Ctrl-C et l'avoir redémarré, peut-on répéter le client echo hello | nc -u 127.0.0.1 5000 commande et observe le fonctionnement.

Est-ce le chemin nc est censé se comporter? Je m'attendrais à ce qu'au moins des appels répétés à echo hello | nc -u 127.0.0.1 5000 serait enregistré - sans avoir à redémarrer le serveur? Ou peut-être existe-t-il un commutateur de ligne de commande spécial pour ce type de comportement?

EDIT: J'ai trouvé cette belle présentation PDF: socat - Manipuler toutes sortes de sockets, qui contient les éléments suivants netcat contre socat Remarques:

netcat - Limitations
  ● one-shot seulement (se termine après la fermeture du socket)
  ...
  Exemples 1: remplacement netcat
  ...
  ● client UDP avec port source:
  nc -u -p 500 1.2.3.4 500
  socat - udp: 1.2.3.4: 500, sp = 500
  ● serveur TCP:
  nc -l -p 8080
  socat - tcp-l: 8080, reuseaddr
  ...

... cependant, j'obtiens à peu près le même comportement que ci-dessus, si je remplace la commande du serveur par "socat - udp4-listen:5000,reuseaddr"- et la ligne client avec"socat - udp:127.0.0.1:5000"... Avec l'entrée canalisée"echo hello | socat - udp:127.0.0.1:5000", la seule différence est qu'ici la commande existe au moins après le mot hello a été envoyé - cependant, encore une fois, des exécutions consécutives de cette commande ne provoqueront aucune réception sur le serveur, jusqu'à ce que le serveur soit redémarré.


9
2017-09-03 20:14


origine




Réponses:


Ok, je pense au moins que j'ai quelque chose avec socat - à savoir l'option fork doit être ajouté à la ligne du serveur:

$ socat - udp4-listen:5000,reuseaddr,fork

... et puis, dans un autre terminal, nous pouvons appeler echo la tuyauterie dans socat ligne client plusieurs fois sur la ligne de commande, car elle se ferme immédiatement (bien, après une demi-seconde :)):

$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000

... et revenons au premier terminal, nous pouvons voir que le serveur a montré avec succès les trois hellos:

$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C

Notez que même avec un fork-ed socat serveur, la ligne echo "hello" | nc -u 127.0.0.1 5000 continuera à "verrouiller" comme s'il attendait la saisie de l'utilisateur; cependant, maintenant après Ctrl-C et en réexécutant la commande, c'est-à-dire

$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C

... la fork-ed socat le serveur montrera trois hellos sans avoir besoin d'être redémarré ..

Apparemment, cet openBSD netcat n'a pas de fork option - mais je ne sais pas si elle en a une qui lui correspond ..

En tout cas, j'espère que cela aidera quelqu'un,
À votre santé!


14
2017-09-03 21:06





Votre netcat ne lit que la sortie de la sortie standard d'echo lorsque vous utilisez pipe, il n'est plus "connecté" au clavier. Pour obtenir la réponse que vous attendez, vous pouvez ajouter vos trois "bonjour" à un fichier et à une exécution.

cat [myfile] | nc -u 127.0.0.1 5000

4
2017-09-03 20:45



Salut @ OldWolf - merci beaucoup pour votre réponse! J'ai essayé votre suggestion (également de manière un peu plus compliquée)cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000"), cependant, alors que je vois trois hellos, ce qui me dérange est toujours présent: cette commande aussi va en quelque sorte "verrouiller", comme si on attendait une saisie de l'utilisateur, et après Ctrl-C et le réexécutant, le serveur ne verra aucune donnée jusqu'à ce qu'il soit redémarré! C’est ce que je voudrais mieux savoir - bravo! - sdaau
nc attend un EOF qui, dans ce cas, ne parvient pas avant que vous envoyiez le signal de sortie au programme. - OldWolf
Ahh, je vois - merci beaucoup pour cette explication, @OldWolf! Apparemment socat peut contourner cela avec le fork option ... Merci encore, bravo! - sdaau


Si vous faites une partie de l'écoute nc, cela montrera que netcat attend la connexion, et une fois qu'il l'obtiendra, il se connectera à cet hôte et à ce port, en ignorant tous les autres. Vous devez ajouter «-k» pour continuer et «-w 0» pour expirer chaque connexion après 0 seconde. Socat est un meilleur choix, je pense.


2
2018-06-03 02:25