在服务器之间传输文件是运维中的高频操作:迁移网站、拉取日志、同步代码……scprsync 是最常用的两个工具。scp 简单直接,适合一次性传输;rsync 支持增量同步和断点续传,适合大文件与目录的定期同步。本文详细介绍两种工具的用法、区别与最佳实践。

本文要点

  • scp 基础语法:上传、下载、目录传输
  • rsync 增量同步:只传变化的部分
  • rsync 常用选项:断点续传、排除文件、删除
  • 两者的适用场景对比
  • 自定义 SSH 端口时的写法差异

scp 基础用法

scp(Secure Copy)基于 SSH 协议,命令格式简单清晰:

# 上传本地文件到远程服务器
scp /本地/文件.txt user@远程IP:/远程/目录/

# 下载远程文件到本地
scp user@远程IP:/远程/文件.txt /本地/目录/

# 递归传输整个目录(加 -r)
scp -r /本地/目录/ user@远程IP:/远程/目录/

# 指定非默认 SSH 端口(注意是大写 -P)
scp -P 2222 文件.txt user@远程IP:/目标路径/

scp 常用选项

选项说明
-r递归传输目录
-P 端口指定 SSH 端口(大写 P)
-i 密钥指定 SSH 私钥文件
-C传输时压缩(适合文本文件)
-v显示详细传输信息(调试用)

rsync 基础用法

rsync 最大的优势在于增量同步:对比源和目标的差异,只传输变化的部分,大大减少传输量,特别适合定期同步大型目录:

# 将本地目录同步到远程(末尾 / 的含义很重要)
rsync -avz /本地/目录/ user@远程IP:/远程/目录/

# 将远程目录同步到本地
rsync -avz user@远程IP:/远程/目录/ /本地/目录/

# 指定非默认 SSH 端口(小写 -e)
rsync -avz -e "ssh -p 2222" /本地/目录/ user@远程IP:/远程/目录/

常用选项详解

选项说明
-a归档模式:递归 + 保留权限/时间戳/符号链接
-v显示传输详情
-z传输时压缩数据
--progress显示每个文件的传输进度
--partial / -P断点续传(保留未传完的文件)
--delete删除目标中在源端已删除的文件
--exclude排除指定文件或目录
--dry-run模拟执行,不实际传输(预览效果)

实用 rsync 示例

# 同步网站目录,排除日志和缓存
rsync -avz --exclude="*.log" --exclude="cache/" \
  /var/www/html/ user@备份服务器:/backup/html/

# 断点续传大文件
rsync -avz --partial --progress 大文件.tar.gz user@远程IP:/目标/

# 镜像同步(源端删除的文件也从目标删除)
rsync -avz --delete /本地/目录/ user@远程IP:/远程/目录/

# 先用 --dry-run 预览会发生什么
rsync -avz --delete --dry-run /本地/目录/ user@远程IP:/远程/目录/

--delete 会永久删除文件

--delete 选项会删除目标端有而源端没有的文件,操作不可逆。建议先用 --dry-run 预览,确认结果符合预期再去掉该参数正式执行。

rsync 中末尾斜杠的含义

rsync 的末尾斜杠容易让人困惑,务必理解:

# 源目录末尾有 /:同步目录内容(不含目录本身)
rsync -av /src/dir/ user@host:/dst/   # → /dst/ 里面是文件

# 源目录末尾无 /:同步目录本身
rsync -av /src/dir user@host:/dst/    # → /dst/dir/ 里面是文件

路径末尾斜杠记忆法

把 /src/dir/ 理解为「进入 dir 里面再传」,/src/dir 理解为「把 dir 这个东西传过去」。

scp vs rsync 选型建议

对比项scprsync
学习成本极低略高
增量传输不支持支持
断点续传不支持支持(--partial)
排除文件不支持支持(--exclude)
适合场景一次性传单文件目录同步、定期备份

小结

  • scp 语法简单,适合临时传输单个文件或小目录
  • rsync 增量同步,适合大目录、定期备份和迁移场景
  • rsync --delete 有风险,先 --dry-run 预览
  • 末尾斜杠决定是传目录内容还是目录本身,注意区分
  • 两者都基于 SSH,密钥登录配置好后传输更便捷

常见问题

rsync 和 scp 哪个更快?

第一次全量传输两者速度相近。之后如果文件有增量变化,rsync 只传差异部分,速度优势明显。大目录定期同步建议用 rsync。

如何在两台远程服务器之间直接传文件(不经过本地)?

在其中一台服务器上执行 rsync -avz -e ssh /本地路径/ user@另一台IP:/目标路径/,前提是两台服务器之间 SSH 可以互通(或配置了密钥)。

rsync 传输时断网了,重新连上怎么继续?

重新执行同样的 rsync 命令并加上 --partial 参数,rsync 会跳过已传完的文件,从断点继续未完成的文件。

传输速度太慢,如何限速或提速?

限速用 --bwlimit=1024(单位 KB/s)避免占满带宽影响业务;提速加 -z 压缩(对文本效果好)或改用更快的 SSH 加密算法:-e 'ssh -c aes128-gcm@openssh.com'。