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

eim*_*rek 30 scp sftp large-files

我用 SCP 试过了,但它说“负文件大小”。

>scp matlab.iso xxx@xxx:/matlab.iso
matlab.iso: Negative file size
Run Code Online (Sandbox Code Playgroud)

还尝试使用 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
Run Code Online (Sandbox Code Playgroud)

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

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

max*_*zig 35

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

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

  • 鉴于文件的很大一部分已经被传输,`rsync` 现在是一个好主意。使用`-P` 选项既可以获取进度指示,也可以指示接收方保留不完整的文件,以防传输再次中断。 (4认同)

spi*_*nup 30

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

split -b 1G matlab.iso
Run Code Online (Sandbox Code Playgroud)

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

scp xa* xxx@xxx:
Run Code Online (Sandbox Code Playgroud)

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

cat xa* > matlab.iso
Run Code Online (Sandbox Code Playgroud)

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


ari*_*ica 10

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

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

file `which scp`
Run Code Online (Sandbox Code Playgroud)

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

$ file `which scp`
/usr/bin/scp: ELF 64-bit LSB  shared object, x86-64 ...
Run Code Online (Sandbox Code Playgroud)

一个 32 应用程序应该仍然能够支持“大文件”,但它必须从具有大文件支持的源代码编译,而这种情况显然不是。

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