Beschädigte .zip-Datei, nachdem sie von Netcat heruntergeladen wurde

650
MyWays

Ich erstelle unter .zipWindows eine Datei mit WinRAR. Diese Datei kann sowohl unter Linux als auch unter Windows geöffnet und extrahiert werden, wenn ich sie per E-Mail oder auf eine andere übliche Weise übertrage.

Bei der Übertragung über Netcat wird die ZIP-Datei jedoch beschädigt.

Wenn ich unter Linux versuche, die netcatted-Datei mit zu extrahieren, erhalte 7zich folgende Fehler:

Open ERROR: Can not open the file as [zip] archive  WARNINGS: Headers Error: There are data after the end of archive 

Ich verschiebe die gleiche netcatted zip-Datei wieder in Windows und versuche, sie zu öffnen. Ich erhalte die Fehlermeldung:

The archive is either in unknown format or damaged. 

Die betreffende ZIP-Datei enthält einen Ordner, der Dateien enthält.

Meine Linux-Maschine ist der Listener, ich habe diese Netcat-Lösung verwendet: HIER

Ich dachte, das könnte das Problem gewesen sein, also habe ich nur die Basislösung verwendet:

  • Listener (Linux):

    nc -lp PORT > file.zip 
  • Absender (Windows, PowerShell):

    Get-Content ZIP_FILE | ./Netcat32 IP PORT 

Noch würde es nicht funktionieren.

Beachten Sie, dass ich beim Übertragen von Textdateien kein Problem hatte, nur ZIP-Dateien.

Nachfolgend sehen Sie den Vergleich der gleichen 2 ZIP-Dateien, die linke wird über netcat übertragen (kann weder von Linux noch von Windows geöffnet werden), die rechte über Mail (kann von beiden geöffnet werden). Sie wurden geöffnet gedit.

Was mache ich falsch und wie mache ich das?

Vergleich

BEARBEITEN: Laut Kamil Maciorowski habe ich versucht, die ZIP-Datei als Bytestrom durch netcat zu senden, wobei dieser Code in Powershell, Windows verwendet wird:

#Sender: $contents=Get-Content -Encoding Byte -ReadCount 0 ./file.zip echo $contents | ./NetCat32 IP PORT 

Nun habe ich auf der Linux-Maschine eine ZIP-Datei, die 6-mal die Originalgröße hat (was kein Problem ist), und der Inhalt enthält 1 bis 3 Ziffern in jeder Zeile. (Aber sollten sie nicht alle in einer Zeile stehen, weil ich das Tag -ReadCount 0 verwendet habe?) (Siehe -ReadCount HERE ).

Ich kann diese Datei nicht öffnen. Beim Versuch, es zu extrahieren, erhalte ich eine Fehlermeldung: "Ist kein Archiv".

Die Eingabe des Linux - Befehl Datei, um den Dateityp „file.zip“ sehe ich erhalten: „ASCII - Text, mit CRLF Zeilenende“

EDIT 2:

Ich bootete ein anderes Linux (als Client), versuchte die SAME-problematische ZIP-Datei zu übertragen, die ursprünglich unter Windows erstellt wurde, und es funktionierte ohne Probleme.

Ich habe wieder in Windows gebootet und die folgenden Befehle in cmd.exe ausprobiert:

type file.zip | Netcat32.exe IP PORT Netcat32.exe IP PORT < file.zip 

Beide haben gearbeitet ...

Ich habe das gleiche an Powershell versucht. Ich habe sogar versucht, get-contentalle verfügbaren Codierungsarten (unbekannt, utf8, unicode ...) zu verwenden. Kein Erfolg.

...

Es scheint, dass das Problem in Powershell und seinem eigenen catBefehl Synonyme ( gc, get-content, type, cat) liegt.

OK, ich muss den Befehl über cmd.exe ausführen, aber ich möchte, wenn möglich, den Befehl cmd.exe in Powershell ausführen.

Meine derzeitige Lösung ist, eine .bat-Datei mit dem gesamten Befehl zu haben, die innerhalb von Powershell aufgerufen wird ... Aber ich wäre froh, eine sauberere Option zu haben.

EDIT 3: Keine .bat-Datei nötig ... Ich hatte Probleme mit invoke-command, invoke-expression, start-job... aber dieser Befehl hat erfolgreich funktioniert:

Start-Process cmd -ArgumentList " /c type file.zip | Netcat32.exe IP PORT" 

Das Problem lag in der Funktionsweise des Powershell- Get-ContentBefehls. Daher musste ich Lösungen in cmd.exe verwenden

Ich werde 1-2 Tage auf eine Powershell-Lösung warten, bevor ich die Frage beantworte.

0
@ KamilMaciorowski Hat nicht funktioniert .. Danke. Gibt es eine einfachere Dateiübertragungslösung als netcat? Aber einer, der genauso tragbar ist? MyWays vor 5 Jahren 0
"netcat" ist so einfach wie es nur geht; Es nimmt Byte-Stream und leitet es durch ein Netzwerk (oder umgekehrt). In diesem Fall sieht es so aus, als würde PowerShell versuchen, intelligent zu sein, anstatt nur binäre Daten zu übergeben. Aber es ist wahrscheinlich nur * anders * als Werkzeuge, die ich kenne; oder vielleicht wissen wir nicht den richtigen Weg. Können Sie ein umfassendes Protokoll für die gemeinsame Nutzung von Dateien wie Samba oder SFTP verwenden? Kamil Maciorowski vor 5 Jahren 0
[Ncat] (https://nmap.org/ncat/) ist die moderne Version, die im Nmap-Paket enthalten ist. harrymc vor 5 Jahren 0
Ich habe weitere Informationen hinzugefügt MyWays vor 5 Jahren 0
get-content wird in Strings geparst. es wird binär zerfressen Yorik vor 5 Jahren 0
@Yorik Gibt es denn einen anderen Weg in Powershell? MyWays vor 5 Jahren 0
Eine Schnellsuche legt außerdem nahe, dass die Option "Byte" für die Codierung in Powershell Version 6 für Get- und Set-Inhalte nicht mehr gültig ist und "AsByteStream" verwendet werden sollte. Sie möchten wahrscheinlich stackoverflow auschecken (zufälliger Link: https://stackoverflow.com/questions/51155829/add-content-bytes-fails-with-powershell-core). Yorik vor 5 Jahren 0

1 Antwort auf die Frage

0
MyWays

Das Problem lag nicht in Netcat, sondern in der Funktionsweise von PowerShell Get-Content.

Was unter cat file.zip > newfile.zipLinux so einfach war, erstellt unter Windows eine beschädigte ZIP-Datei mit der PowerShell-AlternativeGet-Content file.zip | Out-File newfile.zip

Ich muss noch herausfinden, wie man es benutzt. Es ist wahrscheinlich ein Codierungsproblem. (Aber ich habe alle Arten der Kodierung mit dem -EncodingTag ausprobiert ). Und da niemand antwortet, schließe ich die Frage.

Es gibt eine Problemumgehung, die Folgendes verwendet cmd.exe:

cmd /c type file.zip | Netcat32.exe IP PORT