Pourquoi ncat -exec fonctionne-t-il avec un script shell mais pas avec un script perl?

J’essaie d’écrire un petit émulateur matériel qui lit les entrées d’un socket et écrit la réponse. Je veux utiliser ncat pour la partie réseau et Perl pour la logique. Mais quand je lance mon script perl avec ncat, il n’envoie jamais de réponse.

Tout d’abord, cela montre comment je veux utiliser ncat. J’utilise / bin / cat à des fins de démonstration car c’est simple.

Démarrer le serveur ncat -l 1234 -keep-open --exec "/bin/cat"

Démarrer le client ncat 12.34.56.789 1234

En faisant cela, ncat renvoie les commandes comme prévu. Mais quand j’essaie d’écrire cat dans perl et que je l’utilise au lieu de / bin / cat.

 #!/usr/bin/perl while () { print $_; } 

et

 ncat -l 1234 -keep-open --exec "/path/cat.pl" 

ncat n’envoie jamais la réponse au client. Même si à partir de la ligne de commande, il fait exactement ce que fait / bin / cat. En outre, lorsque j’utilise le script bash suivant avec ncat au lieu de / bin / cat, cela fonctionne comme / bin / cat. ncat fait écho à la réponse au client comme je l’espérais.

 #!/bin/bash while [ true ] do read lin echo "$lin" done 

Que dois-je faire pour que mon script Perl fonctionne comme je le souhaite?

Est-ce que l’arrêt de la mise en mémoire tampon (autoflush) de la sortie standard aide? Ajoutez ce qui suit au début de votre chat Perl:

 $| = 1; 

Vous pouvez éventuellement le faire précéder de la select STDOUT; si votre code a fait quelque chose de génial avant cela, mais pour votre script de test à 3 lignes, il n’est pas nécessaire.