通过 ssh 传输大文件 (8 GB)

通过 ssh 传输大文件 (8 GB)

我用 SCP 尝试过,但它显示“负文件大小”。

>scp matlab.iso xxx@xxx:/matlab.iso
matlab.iso: Negative file size

还尝试使用 SFTP,工作正常,直到传输了 2 GB 文件,然后停止:

sftp> put matlab.iso
Uploading matlab.iso to /home/x/matlab.iso
matlab.iso                                           -298% 2021MB -16651.-8KB/s   00:5d
o_upload: offset < 0

知道可能出什么问题吗? SCP和SFTP不支持大于2GB的文件吗?如果是这样,那么如何通过 SSH 传输更大的文件?

目标文件系统是ext4。 Linux发行版是CentOS 6.5。文件系统当前有(可访问的)大文件(最大 100 GB)。

答案1

我不确定 SCP 和 SFTP 的文件大小限制,但您可以尝试使用 split 解决该问题:

split -b 1G matlab.iso

这将创建 1 GiB 文件,默认情况下命名为xaa, xab, xac, ....然后您可以使用 scp 传输文件:

scp xa* xxx@xxx:

然后在远程系统上使用 cat 重新创建原始文件:

cat xa* > matlab.iso

当然,这种解决方法的代价是 split 和 cat 操作所花费的时间,以及本地和远程系统所需的额外磁盘空间。

答案2

同步非常适合通过 ssh 传输大文件,因为它能够继续由于某种原因而中断的传输。由于它使用哈希函数来检测相等的文件块,因此连续功能非常强大。

令人惊讶的是,您的sftp/scp版本似乎不支持大文件 - 即使使用 32 位二进制文​​件,LFS 支持现在应该是相当标准的。

答案3

最初的问题(基于阅读OP问题的所有评论)是scp64位系统上的可执行文件是32位应用程序。未编译的 32 位应用程序“大文件支持”最终得到的查找指针仅限于2^32 =~ 4GB.

您可以scp使用以下命令判断是否是 32 位file

file `which scp`

在大多数现代系统上,它将是 64 位的,因此不会发生文件截断:

$ file `which scp`
/usr/bin/scp: ELF 64-bit LSB  shared object, x86-64 ...

32位应用程序应该仍然能够支持“大文件”,但它必须从具有大文件支持的源代码进行编译,而本例显然不是。

推荐的解决方案可能是使用完整的标准 64 位发行版,其中应用程序默认编译为 64 位。

相关内容