scp中断后不能直接用rsync --append续传,因其假设本地文件是远程文件的严格字节级前缀,而scp残缺文件末尾常含零字节或缓冲残留,导致rsync误判偏移、写入错位;须先校验大小与内容一致性。

scp 中断后为什么不能直接用 rsync --append 续传
因为 scp 和 rsync 的传输机制完全不同:scp 是纯字节流拷贝,不校验内容、不记录偏移;而 rsync --append 假设本地文件是远程文件的「前缀」,仅在本地文件末尾追加缺失部分——但 scp 中断产生的残缺文件,很可能末尾存在零字节、截断块或缓冲区残留,rsync 会误判已传长度,导致跳过损坏段、写入错位数据。
rsync --append 的正确前提和检查步骤
必须确认:本地文件是远程文件的严格前缀(字节级一致),且大小 ≤ 远程文件。否则 --append 会静默出错。
- 先用
ssh user@host 'stat -c "%s" /path/to/remote.file'获取远程文件大小 - 对比本地文件大小:
stat -c "%s" local.file—— 若本地更大,说明已损坏,必须删掉重来 - 若本地更小,用
rsync -I --dry-run --size-only user@host:/path/to/remote.file local.file快速验证是否只是长度差异(跳过 checksum,省时间) - 真正续传前加
--partial --progress,避免中断时丢失已传部分
比 --append 更稳妥的替代方案:--ignore-existing + --partial
对大多数 scp 中断场景,--append 反而是高风险选项。更推荐:
rsync -avzP --partial --ignore-existing user@host:/path/to/remote.file local.file-
--ignore-existing跳过已存在且大小相同的文件,避免覆盖;--partial保留传输中文件,下次可继续 - 如果本地文件大小小于远程,
rsync默认会重新下载整个文件——这看似低效,但比--append写坏数据安全得多 - 如需强制只追加(例如大日志文件),务必先用
dd if=local.file bs=1 count=1024 | md5sum和远程同位置比对,确认开头一致
实际操作中的关键细节
路径、权限、时钟偏差都会让续传失败,不是光看大小就行。
- 远程路径必须用绝对路径,
~/file在某些 shell 下会被 rsync 展开为本地 home - 确保远程用户对源文件有读权限,且 ssh 无密码交互(用
ssh-agent或免密 key) - 若远程服务器时间比本地快 >1 小时,
rsync可能因 mtime 判断跳过文件,加--size-only规避 - 大文件建议加
--bwlimit=5000(单位 KB/s)防突发带宽占满,降低再次中断概率
真正麻烦的从来不是命令怎么写,而是中断后你不知道本地那个“看起来差不多”的文件,到底哪几个字节已经错乱了。










