Wie erstelle ich eine permanente Client-Verbindung mit Netcat?

7

Ich schreibe ein Bash-Skript, das ständig einen Ordner in einer Schleife liest, um Daten in einem definierten Zeitintervall an einen Server zu senden. Ich verwende Netcat als Tool, um eine Verbindung zum Server herzustellen und die Daten zu senden. Mein Pseudocode würde folgendermaßen aussehen:

while true
do
    read_folder()
    process_data() > result.txt
    cat result.txt > netcat ip port
    wait 10 sec
done

Mein einziges Problem ist, dass der Client in diesem Szenario jedes Mal die TCP / IP-Verbindung zum Server verbindet und trennt. Ich würde es vorziehen, die Verbindung am Anfang des Skripts herzustellen und am Ende zu schließen.

Gibt es eine Möglichkeit, dies mit Befehlszeilentools in einem Bash-Skript zu tun?

jmbouffard
quelle
Eigentlich bevorzuge ich dein aktuelles Setup. Bei einer langen Verbindung besteht eine größere Wahrscheinlichkeit eines Verbindungsverlusts. Auf diese Weise erfolgt im Falle eines Verbindungsverlusts nach 10 Sekunden ein automatischer Wiederholungsversuch
bbaja42
Schauen Sie sich an socat, es handelt sich um einen Netcat-Ersatz, der über eine integrierte Funktionalität verfügt, um Pipes nach Abschluss erneut zu spawnen.
Marcin

Antworten:

3

Zwei separate Prozesse: Einer, der result.txt nach netcat kopiert. Result.txt wird über einen anderen Prozess gespeist.

echo -n >result.txt
tail -f result.txt | nc ip port &
while true
do
    read_folder()
    process_data() > result.txt
    wait 10 sec
done
Kevin M.
quelle
Ich habe über so etwas nachgedacht, aber der erste Prozess kehrt zurück, wenn er das Ende der Datei erreicht. Er wartet nicht darauf, dass der andere Prozess darauf schreibt.
jmbouffard
@jmbouffard: behoben. tail -fliest die Datei auch nach Erreichen von EOF weiter.
Kevin M
Danke, es funktioniert erstaunlich gut mit tail -f. Ich kann sogar eine FIFO-Pipe anstelle einer "wachsenden" result.txt-Datei für die Übertragung verwenden. Antwort akzeptiert.
jmbouffard
@ Kevin: Die mit @Gilles vorgenommene Bearbeitung : >result.txtwar in Ordnung, es bleibt kein Zeilenumbruch in der Datei. Testen Sie es selbst.
Caleb
echo -nist auch in Ordnung, solange Ihre Shell es unterstützt (einige Shells drucken -n) - :ist also vorzuziehen (es funktioniert überall). Und du brauchst tail -c +1; Ohne diese Option werden, wenn tailder Start langsam ist, alle bis auf 10 Zeilen der bereits in der Datei enthaltenen Elemente weggelassen.
Gilles 'SO - hör auf böse zu sein'
4

Platzieren Sie die Umleitung einfach außerhalb der Schleife.

while true; do
    read_folder
    process_data
    sleep 10
done | netcat $ip $port

Wenn Sie aus der Schleife heraus in die Standardausgabe der Schleife ausgeben müssen, leiten Sie sie durch einen anderen Dateideskriptor um.

{
  while true; do
      read_folder
      echo tick >&3
      process_data
      sleep 10
  done | netcat $ip $port
} 3>&1
Gilles 'SO - hör auf böse zu sein'
quelle