如何使用部分复制的文件恢复 scp?

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

但在某些时候,我不得不关闭 running 命令(通过 Ctrl + C 或 kill)。

根据我的理解,scp 是按顺序复制文件的,所以应该只有一个部分复制的文件。

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

另外,我知道我可以在 rsync 中做这些事情,但是由于某种原因,scp 对我来说更快,所以我用它来代替。

110645 次浏览

Rsync 的替代方案:

使用 sftp和选项 -r(递归复制整个目录)以及 sftpget命令的选项 -a“恢复现有文件的部分传输”

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

例如:

将目录 /foo/bar从远程服务器复制到本地工作目录 工作目录

echo "get -a /foo/bar" | sftp -r user@remote_server

您应该使用 rsync而不是 ssh

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

关键选项是 -P,它与 --partial --progress相同

默认情况下,如果传输被中断,rsync 将删除任何部分传输的文件。在某些情况下,最好保留部分传输的文件。使用—— part 选项告诉 rsync 保留部分文件,这将使文件其余部分的后续传输更快。

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

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

另一种可能性是,当 scp 停止时,尝试挽救已经启动的 scp。

Ctrl + z 到后台并停止它,然后 ssh 到接收服务器并登录,然后退出。现在 fg 的 scp 进程,并观看它从’停滞’恢复!

我昨天也遇到了同样的问题,通过 scp 转移了一个大的 sql 转储,我很幸运地使用了 wget --continue the_url

那篇博客文章很好地解释了这一点 Http://www.cyberciti.biz/tips/wget-resume-broken-download.html 基本上:

wget --continue url

当 rsync 在运行良好的情况下在几秒钟后也停止时,我最终使用了下面的强制解决方案来启动和停止每60秒重新启动一次下载:

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

自 OpenSSH 6.3以来,您可以在 sftp中使用 reget指令

它具有与 get相同的语法,只不过它从现有本地文件的末尾开始传输。

echo "reget /file/path" | sftp -r user@server_name

同样的效果有 -a切换到 get命令ABC3的全局命令行 -a交换机

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

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