J'ai un script simple qui lit quelques lignes à partir d'une connexion initialisée à l'aide de netcat. Un client peut transmettre des "commandes". Si le client écrit "exit", j'aime bien fermer la connexion.
MAIS: Après avoir transmis la "sortie", le script renvoie la "sortie" reçue mais continue à lire ne plus de ligne avant que le message "Au revoir" ne s'affiche.
echo "Start listening on port $PORT ..."
(echo "Welcome. Please give me one of the following commands:
$AVAILABLECOMMANDS") | nc -q -1 -l $PORT | while read line
do
if [ "$line" == 'exit' ]; then
echo "Received 'exit'"
break
else
result=$(executeCommand $line)
echo "$result"
fi
done
echo "Good bye"
Je pense que je dois réécrire la boucle mais je ne sais pas comment.
Quelqu'un peut aider?
Je vous remercie.
Comme expliqué ici , bash a choisi de ne quitter que lorsque toutes les commandes du tube seront terminées. Ici, netcat
ne veut pas s'arrêter, mais après l'échec du tube final, netcat
échoue. C'est pourquoi vous devez attendre encore une fois pour quitter la boucle (en passant, vous avez une erreur lorsque vous quittez la boucle). Voici une version qui n'a pas ce problème de pipe:
#!/bin/bash
echo "Start listening on port 12345 ..."
while read line
do
if [ "$line" == 'exit' ]; then
echo "Received 'exit'"
break
else
echo "$line"
fi
done < <((echo "Welcome. Please give me one of the following commands: $AVAILABLECOMMANDS") | nc -q -1 -l 12345)
echo "Good bye"
Manière pratique d'obtenir les données entrantes et de les transmettre via netcat.
#!/bin/bash
netcat -l localhost 12345 # port 12345
exec 6<>/dev/tcp/localhost/12345
while read <&6
do
echo "$REPLY"
done