Wie kann ich „cat“ durch „netcat“ mit EOF beenden, ohne die Verbindung zu schließen?

Wie kann ich „cat“ durch „netcat“ mit EOF beenden, ohne die Verbindung zu schließen?

Ich bin auf ein Problem gestoßen, bei dem ich einen Ncat-Server mit dem Befehl habe ncat -l [port] -k -c "cat > foo; cat > bar". Wenn ich mich über Netcat mit diesem Server verbinde, kann ich in die Datei schreiben foound danach in bar. Das Problem besteht darin, dass der Client, der die Verbindung herstellt, das Schreiben foodurch Senden einer beenden möchte ^D, den Client schließt, anstatt mit dem Schreiben in fortzufahren bar, sodass barnie in geschrieben wird. Wie kann ich das umgehen? Was ist eine Alternative dazu, catdie es mir ermöglicht, mit einem Befehl statt mit einer zu beenden EOF?

Antwort1

Wenn Sie zwei Dateien mit nur einer Verbindung übertragen möchten, müssen Sie die Dateien im Datenstrom irgendwie mit einem Marker trennen, da das Dateiende ein Lesevorgang der Länge 0 ist, den Netcat zum Schließen des Sockets verwendet.

Control-Dist möglicherweise das, was Sie in ein Terminal eingeben können, um das Dateiende anzuzeigen, es generiert jedoch kein Zeichen und beendet den Lesevorgang mit einer Länge von 0. Control-DIm Datenstrom ist keins vorhanden.

Um einfach zwei Dateien zu übertragen, können Sie einen vorhandenen Verpackungsbefehl wie verwenden tar. Verwenden Sie nc -k -l 4458 -v -c 'tar xf - >&2'als Empfänger und tar cf - foo barals Absender. (Da die Dateinamen vom Absender stammen, müssen Sie dem Absender vertrauen.)

Alternativ können Sie, wenn Ihre Dateien einfacher Text sind, eine spezielle Zeile einfügen, um die beiden Dateien zu trennen. Beispielsweise beim Absender cat foo; echo bye; cat barund beim Empfänger so etwas wie

nc -k -l 4458 -v -c 'awk -v file=foo '\''/^bye$/{ file="bar";next }{print >file}'\'

Dieses GNU-awk-Skript speichert den ersten Dateinamen in der Variablen fileund ändert ihn dann zum zweiten Dateinamen, wenn es die Zeile „bye“ sieht.

verwandte Informationen