如何使用部分复制的文件恢复scp?[关闭]


97

我使用scp shell命令复制巨大的文件文件夹。

但是在某个时间点,我必须终止正在运行的命令(通过Ctrl + C或终止)。

据我了解,scp是按顺序复制文件的,因此应该只有一个部分复制的文件。

如何恢复相同的scp命令以不覆盖成功复制的文件并正确处理部分复制的文件?

PS我知道我可以在rsync中完成这种工作,但是由于某些原因,scp对我来说速度更快,因此我改用它。


4
我怀疑rsync较慢,因为它花费一些额外的时间来做允许您重新开始传输的操作。您可能会考虑仅使用rsync完成部分传输。
基思·汤普森

2
如果您想聪明一点,可以随时尝试dd使用适当的skip变量,然后输入ssh:)
Mark Nunberg 2014年

1
这对于SO而言是题外话。它属于SuperUser,并且确实在那儿被询问过
Dan Dascalescu

Answers:


185

你应该rsync用完ssh

rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path

关键选项是-P,与--partial --progress

也可以使用其他选项,例如-a(用于存档模式)和-z(启用压缩)。

手册:https//download.samba.org/pub/rsync/rsync.html


43
只是要注意,rsync将恢复以scp开始的批处理副本。
Craig Anderson

6
您将获得“跳过目录”。错误,除非您也指定-r。资料来源:lucasb.eyer.be/snips/rsync-skipping-directory.html
Artur Czajka,2017年

4
为我工作,但我加--append太.... rsync的-P --append -e SSH remoteuser表@远程主机:/远程/路/本地/路
南山集团

1
@CraigAnderson这是被遗漏的重要点。答案听起来像是建议下载应该从rsync开始。
威拉

1
答案中给出的选项对我不起作用,但确实如此:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
兔子兔子

26

rsync的替代方法:

使用sftp带有选项-r(递归复制整个目录)和期权-asftpget命令来恢复现有文件部分转移。

先决条件:您的sftp实现已经具有getwith -a选项。

例:

将目录/foo/bar从远程服务器复制到本地当前目录。目录bar将在本地当前目录中创建。

echo "get -a /foo/bar" | sftp -r server

4
您的解决方案很棒,因为我的服务器不允许在ssh中登录,因此rsync无法正常工作。我需要上传而不是下载,所以这是我的命令:echo "put -a foo/bar" | sftp -r server:/foo
卡洛斯·拉斐尔·拉米雷斯

1
对于恢复部分下载的文件,这似乎是可行的选择,因为rsync似乎对ssh友好(使用非默认端口)。
僵尸


6

另一种可能性是尝试在停顿时挽救您已经启动的scp。

ctrl + z返回后台并停止它,然后SSH到接收服务器并登录,然后退出。现在fg scp进程,并观看它从“停滞”恢复!


在Mac OS X上为我工作。感谢您发布此消息,今天它节省了我的培根!
本·希区柯克

1

当rsync在最初运行良好的几秒钟后也停顿时,我得到了以下蛮力解决方案:

cat run_me.sh
#!/bin/bash
while [ 1 ]
do
  rsync --partial --progress --rsh=ssh user@host:/path/file.tgz file.tgz &
  TASK_PID=$!
  sleep 60
  kill $TASK_PID
  sleep 2
done

1

您可以使用的-rsh-P选项rsync-P用于部分下载和-rsh表示传输已通过ssh协议进行。

完整的命令将是: rsync -P -rsh remoteuser@remotehost:/remote/path /local/path


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.