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 foo
und danach in bar
. Das Problem besteht darin, dass der Client, der die Verbindung herstellt, das Schreiben foo
durch Senden einer beenden möchte ^D
, den Client schließt, anstatt mit dem Schreiben in fortzufahren bar
, sodass bar
nie in geschrieben wird. Wie kann ich das umgehen? Was ist eine Alternative dazu, cat
die 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-D
ist 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-D
Im 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 bar
als 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 bar
und 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 file
und ändert ihn dann zum zweiten Dateinamen, wenn es die Zeile „bye“ sieht.