如何使用部分复制的文件恢复 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
选项(递归复制整个目录)和sftp
的get
命令“恢复现有文件的部分传输”的选项-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 复制到远程服务器 [关闭]
如何获取 Net::OpenSSH->scp_get() 方法复制的文件列表