scp 断了要重传 rsync 可以续传

FreeGuideOnline 最新 2026-07-04

文件传输的断点续传问题

在网络不稳定的环境下,传输大文件时经常会遇到中断。传统的 scp 命令一旦中断,再次执行只会从头开始,所有进度都会被浪费。而 rsync 则天然支持“续传”,它只会同步源和目标之间的差异部分,即使之前传输已经中断,也能从断点处继续,极大节省时间和带宽。

本教程将对比两者差异,并详细讲解如何使用 rsync 实现可靠的文件续传。


为什么 scp 无法续传

scp 基于 SSH 协议,设计目标是进行简单的、一次性的安全拷贝。它不具备:

  • 状态记录:不记录已传输的数据块,也没有清单文件。
  • 差异算法:不对比源和目标,只进行整体顺序传输。
  • 续传机制:传输中断后,临时文件会被丢弃,重新执行就是全新拷贝。

所以当你用 scp 传输一个 10GB 的文件,在 90% 时断开,只能重头再来一遍。


rsync 的续传能力从何而来

rsync 的核心是一个高效的增量传输算法,它可以:

  1. 分块校验:把文件切分成多个数据块,并对每个块计算弱校验和强校验。
  2. 差异比对:向远端发送这些校验信息,远端计算出自己已有文件和源文件的差异部分,只发送对方缺失或不一致的数据块。
  3. 部分传输保留:传输中断后,rsync 默认会在目标路径留下一个后缀为 .XXXXXX 的临时隐藏文件(或通过 --partial 显式保留部分传输文件),下次运行时会自动识别并从断点继续。
  4. 全量匹配复用:即使目标文件不存在,只要之前保留的部分文件还在,它就可以只传输剩余部分。

这种机制使 rsync 非常适合在弱网环境或大文件远程同步场景下使用。


使用 rsync 实现断点续传

基础命令形式

rsync [选项] 源路径 目标路径
  • 源或目标可以是本地路径,也可以是远程地址,格式为 user@host:path
  • 续传的关键选项是 --partial(或 -P)。

必备选项解释

选项 全写 作用
-P --partial --progress 保留部分传输的文件并显示进度。续传的核心参数
-a --archive 归档模式,相当于 -rlptgoD,保留权限、时间戳等,常用作基础同步设置。
-v --verbose 输出详细信息,便于了解传输过程。
-z --compress 传输时压缩数据,适合低带宽网络,但会增加 CPU 消耗。
--append 假设目标文件可能比源短,仅追加缺失数据,不做校验。一般用于日志、文本等可追加的场景,断点续传时慎用(与 --partial 不同)。
--append-verify --append 的基础上还会校验已存在的内容,更安全。
--inplace 直接在目标文件上更新(不先新建临时文件),必须和 --partial 搭配使用才能续传大文件,但有一定风险,传输中断可能导致目标文件不完整。普通续传无需该选项。

最常见、最安全的续传命令组合是:

rsync -avP 源路径 目标路径

实战:远程大文件续传

假设要将本地的 bigfile.iso 传送到远程服务器 192.168.1.100/data/ 目录,账号为 user

第一次传输(可能中断):

rsync -avP bigfile.iso user@192.168.1.100:/data/

执行过程中会显示进度条和传输速度。如果网络断开,进程终止,/data/ 下会留下一个名为 .bigfile.iso.XXXXXX 的临时文件(取决于系统 rsync 版本,也可能是直接保留 bigfile.iso 本身但带不完整标识)。

再次执行相同命令即可续传:

rsync -avP bigfile.iso user@192.168.1.100:/data/

rsync 会自动检测到已存在的部分文件,比对数据块后只传输缺失部分。你会看到进度条从某个非零百分比开始增长。

如果部分文件被意外删除或重命名

有时候临时文件可能被系统清理或误删,此时续传就无从谈起了。为防止这种情况,可以显式指定一个部分传输目录:

rsync -avP --partial-dir=.rsync-tmp bigfile.iso user@host:/data/

这样,中断时的部分数据会保存在远程目标目录下的 .rsync-tmp 子目录中,不会与正常文件混淆,也更容易保持续传状态。

校验式续传(确保数据完整性)

如果担心之前传输中断时损坏了已接收数据的部分块,可以增加校验:

rsync -avP --checksum bigfile.iso user@host:/data/

--checksum 会让 rsync 在比对时对整个文件进行强校验和计算,而不仅依赖时间和大小。这会增加 CPU 和初始延迟,但能确保数据绝对正确。


性能与使用建议

  • 优先使用 -avP:大多数场景下已足够,兼具归档属性、进度显示和续传。
  • 大文件 + 不可靠网络:添加 --partial-dir,并考虑使用 --checksum 定期验证。
  • 不要盲目使用 --append:除非你能确定目标文件仅是源文件的未完成拷贝(如上次就是同一个 rsync 命令中断保留的),否则可能造成内容不匹配。
  • ssh 复用连接:在 SSH 环境下多次调用 rsync 时,可以通过 -e "ssh -o ControlMaster=auto -o ControlPersist=60s" 来复用连接,减少认证开销。

对比总结

特性 scp rsync
续传支持 不支持,中断后重传整个文件 原生支持,通过块差异仅传缺失部分
差异传输 有,节省带宽
进度显示 -v 只显示文件名,无百分比 -P 显示实时进度条
文件属性保持 需要 -p 手动保留时间 -a 默认保留全套元数据
部分传输保护 中断后临时文件被删 通过 --partial 保护中间文件

常见问题

Q:rsync 续传需要服务端也安装 rsync 吗?

A:是的。当使用远程传输时,源和目标两端都需要安装 rsync。对于本地拷贝则不需要。通常通过 SSH 通道时,rsync 会自动在远端调用对应的 rsync 进程。

Q:Windows 上能用吗?

A:可以通过 WSL、Cygwin 或使用 cwRsync 等工具实现类似功能。原生 Windows 环境不支持完整的 rsync,但可用 robocopy 替代,robocopy 也具备续传功能(/Z 参数)。

Q:rsync 的续传和 --partial 有什么区别?

A:--partial 是显式告诉 rsync “务必保留传输中断时的部分文件”,而 rsync 的默认行为有时也会保留临时文件,但不够可靠。为保险起见,总是加上 -P(内含 --partial)。

Q:传输中断后,重启 rsync 会重新比对整个文件吗?

A:是的,它会重新计算源文件和目标部分文件的块校验和,这个过程会消耗一些时间,但网络传输量只限于差异部分,总体依然比完整重传高效得多。