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


27

我尝试过使用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不支持大于2 GB的文件吗?如果是这样,那么如何通过SSH传输更大的文件?

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


5
看起来像是大小可变的溢出。但是AFAIK scp / sftp没有大小限制。什么是目标文件系统?它支持大文件吗?
Milind Dumbare 2015年

1
sftp和scp应用程序呢?您可以使用file命令针对它们的二进制文件找出答案。
mdpc

1
@shepherd-是的
mdpc

2
如果使用进行编译,则32位应用程序可以访问大文件-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64。但是,如果您运行的是64位6.5系统,则可以轻松安装管理员openssh-5.3p1-94.el6_6.1.x86_64openssh-server-5.3p1-94.el6_6.1.x86_64从标准存储库中进行安装。
Mark Plotnick

1
大声笑在软件中使用带符号整数表示文件大小
Lightness与Monica赛跑

Answers:


9

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

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

file `which scp`

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

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

32个应用程序仍应能够支持“大文件”,但必须从具有大文件支持的源代码进行编译,而这种情况显然并非如此。

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


33

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

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


4
鉴于文件的大部分已经传输,rsync现在是个好主意。使用该-P选项既可以获取进度指示,也可以指示接收者保留不完整的文件,以防传输再次中断。
西蒙·里希特

25

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

split -b 1G matlab.iso

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

scp xa* xxx@xxx:

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

cat xa* > matlab.iso

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


1
好主意。我已经使用USB驱动器传输了文件,但这可能会更方便。但是,不如让scp和sftp正常工作那样方便。
eimrek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.