有没有办法恢复文件的中断SCP?


12

我偶尔会通过scp下载一个非常大的文件,每次连接断开并中途中断传输的机会很小。

有办法恢复吗?

Answers:


9

您可以尝试以下方法:使用dd代替scp跳过下载的部分,并将其余部分追加到文件中。

sofar=`ls -l ./destfile | awk '{print $5}'`
ssh rsys "dd if=./srcfile bs=1 skip=$sofar" >> ./destfile

可能的优化:大块工作。让我们将其留作家庭作业。


我尚未对此进行测试,但是由于使用dd听起来是一种很好的解决方法,所以我暂时接受了答案。
GJ。

我刚刚测试过,效果很好,谢谢!
科萨克2015年

@Kossak,很高兴听到!
yrk

dd具有小块大小可能会很慢(此处仅为350 kB / s)。幸运的是,scp传输似乎以1024字节为单位。如果是这样你的文件(或者,通过将其截断到最近的1024字节块),可以加速这一过程是这样的:ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile。(请注意,$sofar然后必须是要跳过的1024个字节块!)
tanius

2
我花了一些时间才意识到,rsys第二行只是一个示例主机名,而不是的一些特殊参数ssh。我建议您将其替换user@host为避免混淆。
艾哈迈德·埃萨姆

7

scp,不。

如果两端都有,则可以rsync -LvzP remoteserver:path/to/file localfile用来传输单个文件。


这为我节省了下载巨大文件的时间,但该文件被中断了。谢谢。
phette23

3

是的,有多种方法可以从中断点恢复,但是使用scp是不可能的。sftp reget filename做你所需要的。Yarek和Grawity提供了对我+1都有效的有效解决方案,但是为了从中断的角度恢复,我喜欢rsync。提供的示例命令均假设您正在从远程服务器检索文件到本地工作站(下载)。请记住,应该按顺序将最后两个参数视为source_file和target_file。文件名的语法取决于源文件还是目标文件是本地文件还是远程文件。如果我正在发送(上传)[文本]文件,则将重写以下示例:

#从本地到远程
sofar =`ssh remote_system ls -l interrupted_file | awk'{print $ 5}'`;
dd if = source_file bs = 1 skip = $ sofar | ssh remote_system“猫>> ./interrupted_file”

在rsync解决方案中,我添加-e ssh。您应该考虑是否需要冗长,压缩,保留所有权,权限,时间戳,递归目录等。有关-L参数,请查看手册页和google。您可能希望符号链接保留为链接,而不是引用它们。

rsync -P -e ssh local_source_file remoteserver:path/to/interrupted_target_file


1

还有另一种解决方案(此处未指定rsyncdd解决方案),令我惊讶的是没有人提及:这是的reput命令sftp


0
scp -o ConnectTimeout 60

使您可以指定连接超时。可以防止连接中断。


0

是的,如果两端都支持sftp- scp remoteuser@remotehost:/absolute/filename .失败后,您可以继续操作sftp remoteuser@remotehost,然后reget /absolute/filename继续下载。

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.