SCP 与 Rsync 命令
SCP 命令
SCP(Secure Copy)用于通过 SSH 协议在本地和远程主机之间安全地复制文件。
基本语法
scp [选项] 源路径 目标路径
常用选项
| 选项 | 说明 |
|---|---|
-r | 递归复制整个目录 |
-P port | 指定 SSH 端口(注意是大写 P) |
-p | 保留文件的权限和时间戳 |
-q | 静默模式,不显示传输进度 |
-v | 详细模式,显示调试信息 |
-i | 指定私钥文件 |
-C | 启用压缩 |
使用实例
1. 从本地复制文件到远程服务器
scp /path/local/file.txt user@remote_host:/path/remote/
2. 从远程服务器复制文件到本地
scp user@remote_host:/path/remote/file.txt /path/local/
3. 复制整个目录
scp -r /path/local/folder user@remote_host:/path/remote/
4. 指定端口复制
scp -P 2222 /path/local/file.txt user@remote_host:/path/remote/
5. 使用私钥复制
scp -i ~/.ssh/my_key.pem /path/local/file.txt user@remote_host:/path/remote/
6. 同时复制多个文件
scp file1.txt file2.txt user@remote_host:/path/remote/
Rsync 命令
Rsync(Remote Sync)是一个快速、通用的文件同步工具,支持增量备份,只传输变化的部分。
基本语法
rsync [选项] 源路径 目标路径
常用选项
| 选项 | 说明 |
|---|---|
-a | 归档模式,等同于 -rlptgoD(保留权限、链接、时间等) |
-v | 详细输出 |
-z | 传输时压缩数据 |
-h | 人类可读的输出格式 |
-n | 模拟运行(dry-run) |
--delete | 删除目标目录中多余的文件 |
--exclude | 排除指定模式的文件 |
--progress | 显示传输进度 |
-P | 等同于 –partial –progress |
--bwlimit | 限制传输带宽(单位 KB/s) |
使用实例
1. 同步本地目录
rsync -av /path/source/ /path/destination/
2. 同步到远程服务器
rsync -av /path/local/ user@remote_host:/path/remote/
3. 从远程同步到本地
rsync -av user@remote_host:/path/remote/ /path/local/
4. 模拟运行(测试效果)
rsync -avn /path/source/ /path/destination/
5. 排除特定文件/目录
rsync -av --exclude='*.log' --exclude='node_modules/' /path/source/ /path/destination/
6. 删除目标中多余的文件
rsync -av --delete /path/source/ /path/destination/
7. 限速传输(避免占用过多带宽)
rsync -av --bwlimit=1000 /path/source/ /path/destination/
8. 使用 SSH 指定端口
rsync -av -e "ssh -p 2222" /path/source/ user@remote_host:/path/remote/
SCP vs Rsync 对比
| 特性 | SCP | Rsync |
|---|---|---|
| 传输方式 | 每次全量传输 | 增量传输,只传变化部分 |
| 速度 | 较慢 | 快(尤其是大文件少量修改时) |
| 断点续传 | 不支持 | 不支持(但可以用 –partial) |
| 带宽控制 | 不支持 | 支持(–bwlimit) |
| 复杂度 | 简单 | 功能丰富,较复杂 |
| 权限保留 | 需要 -p 选项 | -a 选项自动保留 |
选择建议
- 小文件传输:两者皆可,SCP 更简单
- 大文件/目录同步:推荐 Rsync,省时省带宽
- 需要增量备份:必须用 Rsync
- 一次性快速复制:SCP 更方便
常用场景
定时备份脚本示例
#!/bin/bash
# 使用 rsync 同步并删除目标多余文件
rsync -avz --delete -e ssh /data/ user@backup_server:/backup/data/
#!/bin/bash
# 使用 scp 定时推送备份
scp -r /data/backup_$(date +%Y%m%d).tar.gz user@backup_server:/backup/