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

Posted

技术标签:

【中文标题】如何使用部分复制的文件恢复 scp? [关闭]【英文标题】:How to resume scp with partially copied files? [closed] 【发布时间】:2014-12-12 05:20:55 【问题描述】:

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

但有时我不得不终止正在运行的命令(按 Ctrl+C 或 kill)。

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

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

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

【问题讨论】:

我怀疑 rsync 速度较慢,因为它会花费一些额外的时间来做一些允许您重新开始传输的事情。您可以考虑只使用 rsync 来完成部分传输。 如果你想聪明一点,你可以随时尝试dd 使用适当的skip 变量,然后通过管道传递给ssh :) 这与 SO 无关。它属于超级用户,实际上属于has been asked there。 rsync 默认使用 ssh Typically, rsync is configured to use ssh by default 所以...它应该差不多快(尽管它首先列出目录,这可能会导致启动速度较慢) 【参考方案1】:

你应该使用rsync而不是ssh

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

关键选项是-P,和--partial --progress一样

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

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

说明书:https://download.samba.org/pub/rsync/rsync.html

【讨论】:

只是想注意 rsync 将恢复以 scp 开始的批量复制就好了。 你会得到“跳过目录”。错误,除非您还指定 -r。来源:lucasb.eyer.be/snips/rsync-skipping-directory.html 为我工作,但我也添加了 --append ...... rsync -P --append -e ssh remoteuser@remotehost:/remote/path /local/path @CraigAnderson 这是被忽略的重点。答案听起来像是建议下载应该从 rsync 开始。 答案中给出的选项对我不起作用,但确实如此:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path【参考方案2】:

rsync 的替代方案:

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

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

示例:

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

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

【讨论】:

您的解决方案很棒,因为我的服务器不允许登录 ssh,所以 rsync 不起作用。我需要上传而不是下载,所以这是我的命令:echo "put -a foo/bar" | sftp -r server:/foo 这似乎是恢复部分下载文件的可行选项,因为 rsync 似乎对 ssh 不太友好(使用非默认端口)。 这也适用于 Windows,不需要 rsync @codezombie try rsync -P -e "ssh -p 2022" remoteuser@remotehost:/remote/path /local/path 通过端口 2022 访问 ssh 等你也可以通过任何其他 ssh像这样的选项。【参考方案3】:

从 OpenSSH 6.3 开始,您可以在 sftp 中使用 reget command。

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

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

同样的效果有-a切换到get command或者global command-line -a switch of sftp

【讨论】:

【参考方案4】:

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

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

【讨论】:

在 Mac OS X 上为我工作。感谢您发布此内容,它今天救了我的培根! 踢那个网络,看看它是否会自我恢复:)【参考方案5】:

当 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

【讨论】:

【参考方案6】:

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

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

【讨论】:

和 jordi 的回答一样? 这适用于哪个版本的 rsync?我相对现代的版本(rsync 版本 3.1.2 协议版本 31)没有带有单个破折号的 -rsh 选项,只有 --rsh=COMMAND 手册说它是 -e COMMAND 的同义词【参考方案7】:

我昨天遇到了同样的问题,通过 scp 传输了一个巨大的 sql 转储,我很幸运 wget --continue the_url

那篇博文解释得很好 http://www.cyberciti.biz/tips/wget-resume-broken-download.html基本上:

wget --continue url

【讨论】:

当网站出现故障时,最好将网址中的相关部分复制到答案中。 我正在尝试上传,所以我没有 wget。

以上是关于如何使用部分复制的文件恢复 scp? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 scp 将本地文件从 Windows 复制到远程服务器 [关闭]

使用scp递归复制目录时如何过滤文件?

如何获取 Net::OpenSSH->scp_get() 方法复制的文件列表

[转]12个scp传输文件的命令栗子

用于将文件夹从本地计算机复制到远程服务器的 scp 命令语法 [关闭]

有没有办法在 Linux 中继续损坏的 scp(安全复制)命令进程? [关闭]