Ich habe schon eine Weile damit rumgespielt, dass das funktioniert, und ich vermute, dass ein grundlegendes Missverständnis darüber, wie Pipes funktionieren, die Ursache für meine Probleme ist.
Mein Ziel ist es, eine TCP-Verbindung zu einem Remote-Host über zu initiieren netcat
und zwei Named Pipes im Dateisystem zu haben: Eine, von der Prozesse lesen können, um eingehende Daten abzurufen, und eine, auf die Prozesse schreiben können, dienen als ausgehende Daten. Ich benutze derzeit die folgende Konstruktion:
mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &
Von hier aus möchte ich anderen Prozessen erlauben, auf diese offene TCP-Verbindung zu lesen und zu schreiben. Sollte dies "nur funktionieren", oder gibt es einen Grund, warum ein Konstrukt wie dieses nicht funktionieren kann?
Momentan scheint es so zu sein, dass ich out
ohne Probleme lesen kann , aber wenn ich schreibe, in
erhalte ich eine Ausgabe, in der eine kaputte Pipe erwähnt wird, und die gesamte nachfolgende Kommunikation scheint tot zu sein. Gedanken?
(Verwandte: Ich habe ursprünglich verwendet:
netcat foo.bar.org 4000 < out > in &
fand es aber zu blockieren warten auf eingabe. Ich bin auch neugierig, aber es wird wahrscheinlich besser in einer separaten Frage angesprochen.)
write(stdout): Broken pipe
nach (oder kurz danach) Schreiben an dieout
Pipe.Ich hatte mich auch mit diesem Problem konfrontiert. Das Hauptproblem ist
netcat
. Es ist ein großartiges Tool, aber es schließt die Verbindung, wenn einer der verbundenen Eingabe- oder Ausgabedateideskriptoren geschlossen wird. Es macht nichts, wenn der Server nicht lauscht und es wird beendet, wenn der andere Peer geschlossen wird. Solange Sie den Server korrekt einrichten und Ihre Dateideskriptoren geöffnet lassen, funktioniert es. Ich habe zum Beispiel das folgende Szenario getestet und es hat sehr gut funktioniert: In einem Terminal-Setup einen Echoserver (ich habe es wie folgt eingerichtet):Jetzt in einem anderen Terminal einrichten Sie Ihre FIFO-Verbindung zu Ihrem Server:
Was auch immer der Server an Sie sendet, drucken Sie aus (und lassen Sie es laufen, wenn Sie
in
fifo in einer Anwendung verwenden, die bei Beendigung ein Endenetcat
schließt, wird die Verbindung geschlossen).und im selben Terminal:
Jetzt wird alles, was Sie eingeben, erneut gedruckt (nachdem Sie die Eingabetaste gedrückt haben). Durch Schließen dieses Befehls wird auch die Verbindung geschlossen.
quelle
netcat -t -l -p 4000 < loopFF | tee loopFF
verursacht es keine unendliche Rückkopplungsschleife mit sich selbst?netcat
dann geschlossen wird, wenn eine seiner Netzwerkverbindungen geschlossen wird. Wenn Sie den Client schließen (der eine Zeichenfolge sendet und dieselbe Zeichenfolge empfängt), wird auch dernetcat
Server geschlossen. In diesem Fall habe ich einen Server-Code für mich geschrieben, der sich dazu auffordert, mehrere Clients zu verwalten und die Verbindung der Clients wiederherzustellen.Die Analyse von Steven Monday sieht für mich gut aus: Kommt
cat
nach Deinem 1. Schreiben wieder an,out
weil der Fifo istempty
. Um dies zu vermeiden, ist die Lösung, einen Prozess mit geöffnetem FIFO im Schreibmodus zu belassen, der erstecat
im folgenden Beispiel:(Die Out-PID-Datei ist der Weg, um das Ganze zu stoppen:.
kill -9 $(cat out-pid)
)Ein weiteres Beispiel hier .
quelle