it-swarm.com.de

BASH: Liest Zeilen von der Netcat-Verbindung

Ich habe ein einfaches Skript, das einige Zeilen von einer Verbindung liest, die mit Netcat initialisiert wurde. Ein Client kann einige "Befehle" senden. Wenn der Client "exit" schreibt, möchte ich die Verbindung schließen.

ABER: Nach dem Senden des "exit" gibt das Skript den "Received 'exit'" wieder, liest aber noch one more line, bevor das "Good bye" erscheint.

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"

Ich denke, ich muss die Schleife umschreiben, aber ich habe keine Ahnung, wie.

Kann jemand helfen?

Danke.

3
ErWu

Wie in hier erklärt, hat bash die Entscheidung getroffen, nur zu beenden, wenn alle Befehle in der Pipe beendet wurden. Hier möchte netcat nicht anhalten, aber nachdem das Endrohr gebrochen ist, schlägt netcat fehl. Aus diesem Grund müssen Sie ein weiteres Mal warten, um die Schleife zu beenden (Sie haben übrigens einen Fehler, wenn Sie die Schleife beenden). Hier ist eine Version, die dieses Pipe-Problem nicht hat:

#!/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

Praktische Möglichkeit, eingehende Daten abzurufen und Daten über Netcat zu übertragen.

#!/bin/bash

netcat -l localhost 12345  # port 12345
exec 6<>/dev/tcp/localhost/12345

while read <&6
do
        echo "$REPLY"
done
2
ssshake