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 netcat
schließ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
nc
wird 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 nc
verwendet. Sie können das UDP-Protokoll anfordern, das dies nicht tut. Dies ist nc -u
jedoch nicht der Fall.
2
Im oben genannten Beispiel gibt es ein Originalbeispiel README.gz
, das auf dem -w
Zeitlimit basiert und nicht erfordert, dass die -q
Option 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.