【问题标题】:How to resume scp with partially copied files? [closed]如何使用部分复制的文件恢复 scp? [关闭]
【发布时间】: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 所以...它应该差不多快(尽管它首先列出目录,这可能会导致启动速度较慢)

标签: bash rsync scp resume


【解决方案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。
      猜你喜欢
      • 2014-12-09
      • 2022-11-15
      • 2015-11-12
      • 2018-08-19
      • 2016-09-30
      • 1970-01-01
      • 2015-03-17
      • 2014-06-09
      • 2013-11-25
      相关资源
      最近更新 更多