Erfahren Sie, wann NC mit dem Übertragen einer Datei fertig ist


11

Gibt es eine Möglichkeit zu wissen, wann Netcat mit dem Übertragen einer Datei zwischen Computern fertig ist?

Aktuelle Befehle:

Maschine Nr. 2: nc -lp 5555 > test.txt

Maschine Nr. 1: nc MachineIP Port < test.txt

Die Übertragung erfolgt, es gibt jedoch keinen visuellen Hinweis darauf, dass die Übertragung abgeschlossen wurde.

Antworten:


19

Zuerst einige Hintergrundinformationen

Es gibt verschiedene Versionen von nc, wie Sie auf der Manpage nc (1) - Linux oder im Handbuch für allgemeine Befehle von nc (1) BSD finden. Die Verbindung sollte direkt nach der Übertragung unterbrochen werden. Auf beiden verlinkten Seiten gibt es ein Beispiel:

Verwenden Sie zunächst nc, um einen bestimmten Port abzuhören, wobei die Ausgabe in einer Datei erfasst wird:

$ nc -l 1234 > filename.out

Stellen Sie mit einem zweiten Computer eine Verbindung zum Listening-NC-Prozess her und geben Sie ihm die Datei ein, die übertragen werden soll:

$ nc host.example.com 1234 < filename.in

Nachdem die Datei übertragen wurde, wird die Verbindung automatisch geschlossen.

Sie netcatschließen die Verbindung nach der Übertragung nicht, daher unterscheidet sie sich von den oben beschriebenen. Es verhält sich wie meins, Netcat 1.10 auf Debian Jessie. Dieses Verhalten ist dokumentiert in /usr/share/doc/netcat-traditional/README.gz(auf meinem Computer), die Boldening ist meine:

In der einfachsten Verwendung erstellt "nc host port" eine TCP-Verbindung zum angegebenen Port auf dem angegebenen Zielhost. Ihre Standardeingabe wird dann an den Host gesendet, und alles, was über die Verbindung zurückkommt, wird an Ihre Standardausgabe gesendet. Dies wird auf unbestimmte Zeit fortgesetzt, bis die Netzwerkseite der Verbindung heruntergefahren wird. Beachten Sie, dass sich dieses Verhalten von den meisten anderen Anwendungen unterscheidet, bei denen alles heruntergefahren und nach einem Dateiende an der Standardeingabe beendet wird.

Hier ist die Begründung für dieses Verhalten:

Möglicherweise fragen Sie sich: "Warum nicht einfach Telnet verwenden, um eine Verbindung zu beliebigen Ports herzustellen?" Gültige Frage, und hier sind einige Gründe. Telnet hat das Problem "Standardeingabe-EOF", daher müssen berechnete Verzögerungen bei der Steuerung von Skripten eingeführt werden, damit die Netzwerkausgabe beendet werden kann. Dies ist der Hauptgrund, warum netcat so lange ausgeführt wird, bis die Netzwerkseite geschlossen wird.

Wikipedia hat eine Reihe von verschiedenen Implementierungen . Ich kann jedoch keine Unterschiede nennen. Vielleicht kann es jemand anderes?


Nun Lösungen

1

Sie können festlegen nc, dass das Programm beendet werden soll, nachdem die Datei gelesen wurde. Diese Option ist nützlich:

-q seconds   after EOF on stdin, wait the specified number  of  seconds
             and then quit. If seconds is negative, wait forever.

Wenn Sie diesen Befehl auf der sendenden Seite verwenden:

nc -q 0 MachineIP Port < test.txt

ncwird 0 Sekunden nach dem Lesen von EOF beendet, dh kurz nachdem die Datei beendet wurde. Es wird dann beendet und das empfangende Ende auch nc.

Wenn Sie sich fragen, was passiert, wenn die Pakete nicht übermittelt werden, finden Sie hier einen Kommentar von Juraj.

Wenn nicht alle Pakete gefunden werden, erkennt das System dies und überträgt sie erneut, ohne dass die Anwendung dies bemerkt (oder wenn dies nicht möglich ist, wird bei der Anwendung ein Timeout-Fehler angezeigt). Zuverlässige Bereitstellung ist der Zweck des TCP-Protokolls, das vom Betriebssystemkern bereitgestellt wird, der es ncverwendet. Sie können das UDP-Protokoll anfordern, das dies nicht tut. Dies ist nc -ujedoch nicht der Fall.

2

Im oben genannten Beispiel gibt es ein Originalbeispiel README.gz, das auf dem -wZeitlimit basiert und nicht erfordert, dass die -qOption in Ihrer Implementierung vorhanden ist.

Netcat kann als einfacher Datenübertragungsagent verwendet werden, und es spielt keine Rolle, welches Ende der Listener und welches der Client ist - die Eingabe auf der einen Seite kommt auf der anderen Seite als Ausgabe an. Es ist hilfreich, den Listener auf der Empfangsseite ohne angegebenes Timeout zu starten und der sendenden Seite dann ein kleines Timeout zu geben. Auf diese Weise hört der Listener so lange zu, bis Sie ihn kontaktieren. Wenn die Daten nicht mehr fließen, läuft der Client ab, fährt herunter und nimmt den Listener mit. Sofern das dazwischenliegende Netzwerk nicht mit Problemen behaftet ist, sollte dies absolut zuverlässig sein, und Sie können das Timeout jederzeit verlängern. Ein typisches Beispiel für etwas "rsh" wird oft verwendet für: auf einer Seite,

nc -l -p 1234 | uncompress -c | tar xvfp -

und dann auf der anderen Seite

tar cfp - /some/dir | compress -c | nc -w 3 othermachine 1234

Überträgt den Inhalt eines Verzeichnisses von einem Computer auf einen anderen, ohne sich um .rhosts-Dateien, Benutzerkonten oder inetd-Konfigurationen an beiden Enden kümmern zu müssen.


Ich kann das scheinbar nicht zum Laufen bringen. Wenn ich -q mache, heißt es, dass der Befehl nicht existiert. Ich sehe -w ähnlich aussehen, aber dies führt nicht dazu, dass die Verbindung beendet wird
Anthony Russell

Was ist deine ncVersion? Zur Überprüfung: nc -herste Zeile.

ehh ja es ist ziemlich alt. Ich bin auf einem alten Bild von Linux. Ich werde es aktualisieren und es noch einmal versuchen
Anthony Russell

Ich habe meine Antwort aktualisiert.

1
Wenn nicht alle Pakete gefunden werden, erkennt das Betriebssystem dies und überträgt sie erneut, ohne dass die Anwendung dies bemerkt (oder wenn dies immer noch fehlschlägt, wird bei der Anwendung ein Timeout-Fehler angezeigt). Zuverlässige Bereitstellung ist der Zweck des TCP-Protokolls, das vom Betriebssystemkern bereitgestellt wird, den nc verwendet. Sie können das UDP-Protokoll, das dies nicht tut, mit nc -u anfordern, dies ist jedoch nicht der Fall.
Juraj
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.