web-dev-qa-db-fra.com

BASH: Lire les lignes de la connexion netcat

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.

3
ErWu

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"
1
tobiasBora

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
2
ssshake