Поврежденный файл .zip после загрузки Netcat

518
MyWays

Я создаю .zipфайл с WinRAR в моей Windows, его можно открывать и извлекать в Linux, а также в Windows, если я передаю его по почте или любым другим обычным способом.

Но когда я передаю его через Netcat, почтовый файл поврежден.

В Linux, когда я пытаюсь извлечь файл netcatted 7z, я получаю сообщения об ошибках:

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

Я перемещаю тот же zip-файл по сети в Windows и пытаюсь открыть его, я получаю сообщение об ошибке:

The archive is either in unknown format or damaged. 

Данный zip-файл содержит папку, в которой находятся файлы.

Мой Linux-компьютер является слушателем, я использовал это решение Netcat: ЗДЕСЬ

Я подумал, что это может быть проблема, поэтому я просто использовал базовое решение:

  • Слушатель (Linux):

    nc -lp PORT > file.zip 
  • Отправитель (Windows, PowerShell):

    Get-Content ZIP_FILE | ./Netcat32 IP PORT 

Все равно не сработает.

Обратите внимание, что у меня не было проблем с переносом текстовых файлов, только файлы zip.

Ниже приведено сравнение тех же двух zip-файлов, левый передается через netcat (не может быть открыт ни в Linux, ни в Windows), правый - по почте (может быть открыт обоими). Они были открыты в gedit.

Что я делаю не так и как заставить это работать?

comparison

РЕДАКТИРОВАТЬ: Согласно Kamil Maciorowski я пытался отправить zip-файл через netcat в виде потока байтов, используя этот код в Powershell, Windows:

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

Теперь на Linux-машине у меня есть zip-файл, который в 6 раз больше исходного размера (что не проблема), и его содержимое состоит из 1-3 цифр в каждой новой строке. (Но разве они не должны быть в одной строке, потому что я использовал тег -ReadCount 0? (См. -ReadCount ЗДЕСЬ )

Я не могу открыть этот файл. Пытаясь извлечь его, я получаю ошибку: «Это не архив».

Набрав командный файл linux, чтобы увидеть тип файла "file.zip", я получаю: "ASCII TEXT, с ограничителями строки CRLF"

РЕДАКТИРОВАТЬ 2:

Я загрузил другой linux (как клиент), попытался передать тот же проблемный zip-файл, который был изначально создан на Windows, и он работал без проблем.

Я загрузился обратно в Windows и попробовал следующие команды в cmd.exe:

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

Оба работали ...

Я попробовал то же самое на powershell. Я даже пытался использовать get-contentвсе доступные типы кодирования (unknown, utf8, unicode ...). Нет успеха

...

Кажется, что проблема в powershell и его собственных catсинонимах команды ( gc, get-content, type, cat) ..

Хорошо, я должен выполнить команду через cmd.exe, но я хочу выполнить команду cmd.exe внутри powershell, если это возможно.

Мое текущее решение, которое работает, - это иметь файл .bat со всей командой, которая вызывается внутри powershell ... Но я был бы рад иметь более понятный вариант.

РЕДАКТИРОВАТЬ 3: Нет необходимости для файла .bat ... У меня были проблемы с invoke-command, invoke-expression, start-job..., но эта команда работала успешно:

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

Проблема была в том, как Get-Contentработает команда Powershell, поэтому мне пришлось использовать решения в cmd.exe

Я подожду 1-2 дня для решения PowerShell, прежде чем ответить на вопрос.

0
@KamilMaciorowski не работает .. Спасибо, хотя. Есть ли более простое решение для передачи файлов, кроме netcat? Но такой же портативный? MyWays 6 лет назад 0
`netcat` настолько прост, насколько это возможно; он принимает поток байтов и пропускает его через сеть (или наоборот). В этом случае мне кажется, что PowerShell пытается быть умным или чем-то другим, а не просто передавать двоичные данные. Но, вероятно, это просто * отличается * от инструментов, которые я знаю; или, может быть, мы не знаем правильный путь. Можете ли вы использовать полномасштабный протокол обмена / передачи файлов, такой как Samba или SFTP? Kamil Maciorowski 6 лет назад 0
[Ncat] (https://nmap.org/ncat/) - это современная версия, включенная в пакет Nmap. harrymc 6 лет назад 0
я добавил больше информации MyWays 6 лет назад 0
get-content будет анализировать строки. это будет искажать двоичный Yorik 6 лет назад 0
@Yorik Есть ли другой способ в Powershell? MyWays 6 лет назад 0
Быстрый поиск также показывает, что опция «byte» для кодирования больше не действительна для содержимого get и set в Powershell v.6 и что следует использовать «AsByteStream». Вы, вероятно, хотите проверить stackoverflow (случайная ссылка: https://stackoverflow.com/questions/51155829/add-content-bytes-fails-with-powershell-core) Yorik 6 лет назад 0

1 ответ на вопрос

0
MyWays

Проблема была не в Netcat, а в том, как работает команда PowerShell Get-Content.

То, что было так же просто, как cat file.zip > newfile.zipв Linux, создает поврежденный zip-файл в Windows с помощью альтернативы PowerShell.Get-Content file.zip | Out-File newfile.zip

Мне еще предстоит выяснить, как его использовать. Это наверное проблема кодирования. (Но я пробовал все типы кодирования с -Encodingтегом). И поскольку никто не отвечает, я закрою вопрос.

Есть обходной путь, использующий cmd.exe:

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