我使用 scp shell 命令来复制巨大的文件夹。
但在某些时候,我不得不关闭 running 命令(通过 Ctrl + C 或 kill)。
根据我的理解,scp 是按顺序复制文件的,所以应该只有一个部分复制的文件。
如何恢复相同的 scp 命令,不覆盖成功复制的文件,并正确处理部分复制的文件?
另外,我知道我可以在 rsync 中做这些事情,但是由于某种原因,scp 对我来说更快,所以我用它来代替。
Rsync 的替代方案:
使用 sftp和选项 -r(递归复制整个目录)以及 sftp的 get命令的选项 -a“恢复现有文件的部分传输”
sftp
-r
get
-a
先决条件: 您的 sftp实现已经具有 get和 -a选项。
例如:
将目录 /foo/bar从远程服务器复制到本地工作目录 工作目录
/foo/bar
echo "get -a /foo/bar" | sftp -r user@remote_server
您应该使用 rsync而不是 ssh
rsync
ssh
rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path
关键选项是 -P,它与 --partial --progress相同
-P
--partial --progress
默认情况下,如果传输被中断,rsync 将删除任何部分传输的文件。在某些情况下,最好保留部分传输的文件。使用—— part 选项告诉 rsync 保留部分文件,这将使文件其余部分的后续传输更快。
还可以使用其他选项,如 -a(用于归档模式)和 -z(用于启用压缩)。
-z
手册: https://download.samba.org/pub/rsync/rsync.html
另一种可能性是,当 scp 停止时,尝试挽救已经启动的 scp。
Ctrl + z 到后台并停止它,然后 ssh 到接收服务器并登录,然后退出。现在 fg 的 scp 进程,并观看它从’停滞’恢复!
我昨天也遇到了同样的问题,通过 scp 转移了一个大的 sql 转储,我很幸运地使用了 wget --continue the_url
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指令。
reget
它具有与 get相同的语法,只不过它从现有本地文件的末尾开始传输。
echo "reget /file/path" | sftp -r user@server_name
同样的效果有 -a切换到 get命令或 ABC3的全局命令行 -a交换机。
您可以使用 rsync的 -rsh和 -P选项。-P用于部分下载,-rsh表示传输通过 ssh 协议。
-rsh
完整的命令是: rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
rsync -P -rsh remoteuser@remotehost:/remote/path /local/path