在服务器之间传输文件是运维中的高频操作:迁移网站、拉取日志、同步代码……scp 和 rsync 是最常用的两个工具。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 选型建议
| 对比项 | scp | rsync |
|---|---|---|
| 学习成本 | 极低 | 略高 |
| 增量传输 | 不支持 | 支持 |
| 断点续传 | 不支持 | 支持(--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'。