Mehrere Dateien gleichzeitig in Netcat empfangen, ohne die letzte Datei zu überschreiben

416
MyWays

1 Maschine hört zu (Linux), während mehrere Clients (Windows) Dateien an denselben Überwachungsport senden. Netcat empfängt die Dateien seriell mit dem Tag -k.

Listening machine:  nc -lp PORT -k > fileX Clients:  nc IP PORT < file?? 

Ich möchte mehrere Dateien aus mehreren Quellen erhalten, OHNE sie überschreiben.

Bitte sehen Sie sich die vorherigen Befehle an. Die Listener-Maschine schreibt die Ausgabe immer in fileX und überschreibt somit die Datei des vorherigen Clients.

Ich möchte irgendwie in der Lage sein, den Ausgabedateiname für jeden anderen Client zu ändern. Kann der Client den String "file10" irgendwie über netcat senden und so den Listener anweisen, die Ausgabe in> file10 vorzunehmen?

Vielen Dank.

EDIT: kam auf eine Idee:

Dies wird über ein Skript automatisiert:

  1. Zunächst setzt der Listener die Ausgabedatei auf file.txt. (nc -lp PORT> file.txt)

  2. Client sendet String (zB "file123") über netcat. (Dies ist der Dateiname der Datei, die in der Zukunft gesendet wird.)

  3. Listener schreibt in file.txt, liest dann file.txt und startet einen neuen netcat-Listener mit Ausgabedatei> file123

  4. Schließlich sendet der Client Daten.

0

2 Antworten auf die Frage

0
grawity

Nein, das gewöhnliche netcat hat keine speziellen Befehle. Es interpretiert seine Eingabe nicht und weiß nicht einmal, dass es sich bei der Eingabe / Ausgabe um eine Datei handelt: Die Umleitung wird von Ihrer Shell übernommen, und netcat kümmert sich nicht um die Suche.

Sie benötigen also ein zusätzliches Programm, das die empfangenen Eingaben interpretiert und die Ausgabedateien selbst öffnet. Am Ende würden Sie praktisch neu erfinden tar. (Oder cpiooder ein Dutzend anderer ähnlicher Formate.)

[client] tar -cf - fileXYZ | nc <ip> <port> [server] nc -lp <port> | tar -xvf - 

Es gibt Windows-Builds von GNU tar, und Win10 wurde kürzlich gestartet, einschließlich bsdtar . Wenn keines verfügbar ist, müssen Sie ein eigenes Protokoll erstellen. Senden Sie den Dateinamen als erste Zeile und anschließend die Daten. Sie müssen einen benutzerdefinierten Code für den Sender und den Empfänger schreiben .

Das Gruppieren mehrerer Befehle in Klammern als einzelne Pipeline-Einheit hilft dabei:

[client] (echo fileXYZ && type fileXYZ) | nc <ip> <port> [server] nc -lp <port> | (read name; name=$; name=$; cat > "$name") 

Stattdessen würde ich Samba auf der Linux-Maschine einrichten und eine öffentliche Freigabe konfigurieren, sodass Clients dies einfach tun könnten copy fileXYZ \\<ip>\incoming\fileXYZ.

"... ein eigenes Protokoll erstellen" - Der Name des OP ist MyWays. : D Kamil Maciorowski vor 5 Jahren 0
@grawity Danke für die Antwort. Ich werde es versuchen. Bitte lesen Sie meine Antwort noch einmal, da ich eine Idee hinzugefügt habe, und sagen Sie mir, was Sie davon halten. MyWays vor 5 Jahren 0
@ KamilMaciorowski Haha, was soll das heißen? MyWays vor 5 Jahren 0
@MyWays Sie können `tar 'auf Ihre Weise neu erfinden. Kamil Maciorowski vor 5 Jahren 0
Es ist mein Weg oder die Tarway, jk. Ist meine Bearbeitung eine gute Idee? MyWays vor 5 Jahren 0
0
Kamil Maciorowski

Diese andere Antwort beschreibt den Punkt Ihres benutzerdefinierten Protokolls / Setups. Ich werde es nicht wiederholen. Ich gehe davon aus, dass Ihre eigene Lösung das ist, was Sie wollen.

nc -kist nicht das beste Werkzeug, um "mehrere Dateien aus mehreren Quellen" zu erhalten, da es erst nach Beendigung der aktuellen Verbindung auf eine andere Verbindung wartet. Dies bedeutet, dass mehrere Dateien empfangen werden, jedoch nicht parallel. Ihre "mehreren Quellen" blockieren sich gegenseitig.

socatmit reuseaddrund forkkann besser sein.

Als Beweis für das Konzept erstellen wir (auf schnelle und schmutzige Weise) unser benutzerdefiniertes Protokoll. Eine Datei wird als Stream übertragen, der besteht aus:

  1. Dateiname oder Pfad auf der Empfängerseite (ohne Zeilenumbrüche);
  2. einzelne Newline ( \n, LF, 0x0a) als Trennzeichen;
  3. Binärdaten;
  4. EOF.

Dies ist der Empfangsbefehl:

socat TCP-LISTEN:50011,reuseaddr,fork SYSTEM:'read -r f && cat >"$f"' 

(Bearbeiten) Hierbei handelt es sich um einen universellen Empfangsbefehl, der das Nachlaufen \r(falls vorhanden) vom Dateinamen entfernt (nützlich für die Arbeit mit Windows-Clients, die nicht vollständig protokollkonform sind):

socat TCP-LISTEN:50011,reuseaddr,fork SYSTEM:'read -r f && f="$" && cat >"$f"' 

(Bearbeiten endet hier).

So senden Sie eine Datei:

(echo "The new name.foo" && cat "./the file to send.bar") > /dev/tcp/192.168.22.33/50011 

Anmerkungen:

  • 50011 ist eine TCP-Portnummer, Sie können Ihre eigene wählen;
  • 192.168.22.33 ist die Adresse des Servers. Ändern Sie sie entsprechend Ihrer Konfiguration.
  • Ich habe eine /dev/tcp/…/…Syntax verwendet, die in Bash funktioniert, Pipe to, ncwenn Sie wollen / müssen;
  • Dateinamenskollisionen sind immer noch das Problem. Sie benötigen eine geskriptete Logik (anstelle von Plain cat), um sie zu lösen.
  • SYSTEMhat seine Einschränkungen (siehe man socat); Schreiben Sie das Skript nicht in eine Datei und führen Sie die Datei aus. Sie können auch untersuchen EXEC;
  • Unser Protokoll (schnell und schmutzig) bietet dem Server keine Möglichkeit, Fehler (falls vorhanden) oder Erfolg an einen Client zu melden.

Ich habe dies mit dem Debian-Empfänger und dem Ubuntu-Sender getestet. In einem Moment haben drei verschiedene Verbindungen drei verschiedene Dateien von zwei verschiedenen IP-Adressen übertragen. Nachdem alle Übertragungen abgeschlossen waren, md5sumwurde überprüft, ob die Kopien ( höchstwahrscheinlich ) mit den Originalen identisch waren. Sie sind.

Nett. Wie sende ich die Datei, wenn der Client Windows ist? Ich habe es in Powershell versucht. So weit bin ich gekommen. $ file = Get-Content ./somefile; echo "dateiname10" $ datei | ./Netcat32 IP PORT. Auf der Linux-Maschine bekomme ich eine Datei namens "'Dateiname10' $ '\ r'" (ohne Anführungszeichen). Der Inhalt der Datei ist korrekt, der Dateiname ist jedoch deaktiviert. MyWays vor 5 Jahren 0
@ MyWays Ich kann Ihnen mit diesem PowerShell-Code nicht helfen (ich bin ein Linux-Typ, ich habe noch nie mit PowerShell gearbeitet), aber das Problem sieht so aus, als würde es durch [unterschiedliche Zeilenendungen in Windows und in Unix] verursacht werden (https: // de .wikipedia.org / wiki / Newline # Issues_with_different_newline_formats). Kamil Maciorowski vor 5 Jahren 0
@MyWays Obwohl dies durch den richtigen Code zwischen "read" und "cat" in Linux behoben werden kann. Gib mir ein paar Minuten. Kamil Maciorowski vor 5 Jahren 0
@MyWays Meine Antwort befasst sich jetzt damit. Kamil Maciorowski vor 5 Jahren 0
Dies ist eine Zauberei hier. MyWays vor 5 Jahren 0
Tut mir leid zu hijackieren, da es anscheinend keine PM-Option in diesem Forum gibt .. aber wie wird die Verbindung auf dem Client geschlossen, nachdem die Datei übertragen wurde? Ich habe netcat Version 1.11 unter Windows, das keinen -q-Parameter hat wie nc unter Linux. MyWays vor 5 Jahren 0
Lassen Sie uns [diese Diskussion im Chat fortsetzen] (https://chat.stackexchange.com/rooms/84756/discussion-between-kamil-maciorowski-and-myways). Kamil Maciorowski vor 5 Jahren 0