我.zip
在 Windows 上使用 WinRAR 创建了一个文件,如果我通过邮件或任何其他常用方式传输该文件,它可以在 Linux 和 Windows 上打开和提取。
但是当我通过 Netcat 传输它时,zip 文件被损坏了。
在 Linux 上,当我尝试使用 提取 netcat 文件时7z
,出现如下错误:
Open ERROR: Can not open the file as [zip] archive WARNINGS: Headers Error: There are data after the end of archive
我将相同的 netcat 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 文件。
下面是同样的2个zip文件的对比,左边是通过netcat传输的(Linux和Windows都打不开),右边是通过邮件传输的(都可以打开)。它们是在 中打开的gedit
。
我做错了什么以及如何使其发挥作用?
编辑:根据 Kamil Maciorowski 的说法,我尝试通过 netcat 以字节流的形式发送 zip 文件,在 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(作为客户端),尝试传输最初在 Windows 上创建的相同有问题的 zip 文件,并且没有任何问题。
我重新启动 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 运行命令,但如果可能的话,我希望在 powershell 中运行 cmd.exe 命令。
我当前可行的解决方案是拥有一个包含整个命令的 .bat 文件,它在 powershell 内部调用...但我很高兴有一个更干净的选择。
编辑 3:不需要 .bat 文件...我遇到了问题invoke-command, invoke-expression, start-job
...但此命令成功运行:
Start-Process cmd -ArgumentList " /c type file.zip | Netcat32.exe IP PORT"
问题出在 PowershellGet-Content
命令的工作方式上,所以我不得不使用 cmd.exe 中的解决方案
我将等待 1-2 天以获得 powershell 解决方案,然后再回答这个问题。
答案1
问题不在于 Netcat,而在于 PowerShell 命令的Get-Content
工作方式。
在 Linux 中很容易cat file.zip > newfile.zip
使用 PowerShell 替代方法在 Windows 上创建一个损坏的 zip 文件Get-Content file.zip | Out-File newfile.zip
我还没搞清楚如何使用它。这可能是一个编码问题。(但我试过所有类型的标签编码-Encoding
)。既然没人回答,我就关闭这个问题。
有一个解决方法,使用cmd.exe
:
cmd /c type file.zip | Netcat32.exe IP PORT