我正在尝试在 Windows 笔记本电脑上压缩一些文件,然后将它们传输到我的 Ubuntu 服务器并在那里解压,但是在解压档案时我总是收到错误,告诉我档案已损坏。
我做了一些检查,虽然 zip 文件具有相同的文件大小,但传输文件后 SHA256 校验和是不同的。
我使用了以下命令(在我的 Windows 笔记本电脑上使用 PowerShell):
cat .\archive.zip | ssh user@address "cat > ~/archive.zip"
我猜这与操作系统的差异有关,也许是行尾不同。有人知道如何正确传输档案吗?
答案1
这个问题下的其中一条评论:
这可能是因为序列中的
cat
个别出现被改变,因为它是用于文本的。LF
CR
CRLF
真正的猫太懒了,不会做这种恶作剧。在 PowerShell 中cat
是 的别名Get-Content
。您需要几个参数才能使其表现得像一个漂亮的cat
。
示例 6:获取原始内容
此示例中的命令将文件内容作为一个字符串而不是字符串数组获取。默认情况下,如果没有
Raw
动态参数,则内容将作为换行符分隔的字符串数组返回。[…]$raw = Get-Content -Path .\LineNumbers.txt -Raw
我猜想,在你的情况下,这个“以换行符分隔的字符串数组”被连接起来,并且出现了一些行尾的混乱。但即使这样,Raw
你仍然会得到一个字符串。你不想要一个字符串。
示例 8:以字节数组形式获取文件内容
此示例演示如何将文件的内容作为
[byte[]]
单个对象获取。$byteArray = Get-Content -Path C:\temp\test.txt -AsByteStream -Raw
[…]
第一个命令使用
AsByteStream
参数从文件中获取字节流。该Raw
参数确保将字节作为 返回[System.Byte[]]
。如果Raw
参数不存在,则返回值是字节流,PowerShell 会将其解释为[System.Object[]]
。
(来源)
我根本不了解 PowerShell。我不知道您是否应该想要[System.Byte[]]
或[System.Object[]]
,或者这对您来说是否重要。我发现这个说法:
-Raw
与-AsByteStream
/结合-Encoding Byte
实际上是将文件内容作为原始字节数组([byte[]]
)获取,作为单个对象输出(而不是在没有的情况下逐个流式传输字节-Raw
)的最简单方法。
我猜测也许你应该使用Raw
。我确信你应该使用AsByteStream
。
答案2
我找到了如何使用 SFTP,而且确实可以正确传输文件。不过,我仍然想知道为什么 cat 通过 ssh 不起作用,以及在没有 SFTP 的情况下是否可以做到这一点。