Ich habe eine ausführbare Linux-Datei foo
, die Eingaben von fd 0 liest und Ausgaben in fd 0 schreibt ( nicht fd 1). Dies funktioniert gut für die interaktive Verwendung im Terminal.
Wie kann ich dieses Programm über die Shell-Befehlszeile so ausführen, dass Lesevorgänge von fd 0 aus einer Datei stammen, Schreibvorgänge von fd 0 jedoch in eine andere Datei verschoben werden?
Das Beste , was ich mir einfallen lassen kann, ist, $ goo input.txt output.txt | foo
wo goo
sich ein Hilfsprogramm befindet, aber ich kenne kein vorhandenes Hilfsprogramm, und ich weiß nicht einmal, ob die von eingerichtete Pipe |
bidirektional ist.
foo <> /dev/tcp/localhost/1234
in einem Fenster undnc -l 1234 < input.txt > output.txt
in einem anderen scheint zu funktionieren!LD_PRELOAD
Bibliothek zum Überschreiben zu verwenden,write()
so dasswrite()
Aufrufe von FD 0 in FD 1 geändert werden.foo
ausgezogen$PATH
und der Wrapper ersetzt wird, wodurch es einenfoo
in dem gibt$PATH
, der so funktioniert, wie er eigentlich hätte geschrieben werden sollen.Antworten:
Mit
socat
(Version 2 oder höher):Oder noch besser:
Wir verwenden eine
socketpair
bidirektionale (Pipes sind unter Linux nicht bidirektional). Eine andere Möglichkeit besteht darin, ein Pseudo-Terminal (auch bidirektional) zu verwenden, indem Siecommtype=pty
oben verwenden. Dies ist möglicherweise ein besserer Weg, wenn Siefoo
mit einem Terminal sprechen möchten.Oder Sie implementieren den
socketpair
Ansatzperl
wie folgt:(Als schnellen Proof-of-Concept möchten Sie möglicherweise die Fehlerprüfung hinzufügen und effizienter gestalten, indem Sie nicht so viele Prozesse verwenden und die Ausführung vermeiden.
cat
)quelle
E parseopts(): unknown option "commtype"
und der zweite gibt mirE CREATE: wrong number of parameters (3 instead of 1)
.