文件传输工具:scp、rsync
本文将详细对比 scp
和 rsync
,分析它们的基本功能、效率、灵活性以及实际应用场景,帮助您根据需求选择最合适的工具。
# 引言
在现代 IT 基础设施中,文件传输是日常运维中不可或缺的一部分。无论是备份数据、部署应用,还是在多个服务器之间传输文件,选择合适的工具可以大大提高工作效率。scp
和 rsync
是两种广泛使用的文件传输工具,它们基于 SSH 协议,具有不同的特性和使用场景。
scp
(Secure Copy)是一个简单、易用的工具,常用于单次的文件拷贝操作。它的工作原理很简单,通过 SSH 连接安全地将文件从一个系统复制到另一个系统。然而,随着文件数量增多或者需要定期同步文件时,scp
就显得力不从心,因为每次传输都会重复传送完整的文件,即使文件内容没有改变。
与此相比,rsync
(Remote Synchronization)作为一个强大的文件同步工具,具备增量同步的能力。它只传输文件中发生变化的部分,从而节省带宽和传输时间。rsync
在处理大规模数据同步、备份以及跨多台机器的频繁文件更新时,表现出色。
# scp
scp
是 Secure Copy 的缩写,是一个基于 SSH(Secure Shell)协议的命令行工具,用于在本地计算机和远程计算机之间安全地复制文件。
# 语法
scp [选项] [原路径] [目标路径]
选项:
-1:使用ssh协议版本1;
-2:使用ssh协议版本2;
-4:使用ipv4;
-6:使用ipv6;
-B:以批处理模式运行;
-C:使用压缩;
-F:指定ssh配置文件;
-i:identity_file 从指定文件中读取传输时使用的密钥文件(例如亚马逊云pem),此参数直接传递给ssh;
-l:指定宽带限制;
-o:指定使用的ssh选项;
-P:指定远程主机的端口号;
-p:保留文件的最后修改时间,最后访问时间和权限模式;
-q:不显示复制进度;
-r:以递归方式复制。
2
3
4
5
6
7
8
9
10
11
12
13
14
常用选项:
-P
:指定远程主机的 SSH 端口(默认是 22)。-r
:递归复制目录。-p
:保留文件的修改时间、访问时间和权限。-C
:启用压缩传输。-v
:详细模式,显示传输过程中的详细信息,帮助调试。-q
:安静模式,抑制非错误信息。-l
:限制带宽,单位为 Kbit/s。
# 基本用法
上传本地文件到远程机器指定目录
scp /path/to/local/file user@remote_host:/path/to/remote/destination/
1从远程复制到本地
scp user@remote_host:/path/to/remote/file /path/to/local/destination/
1递归复制目录
scp -r /path/to/local/directory user@remote_host:/path/to/remote/destination/
1指定端口传输
scp -P 2222 /home/user/file.txt user@remote.example.com:/backup/
1使用密钥文件认证
scp -i /path/to/private_key.pem /local/file user@remote_host:/remote/path/
1
# 安全性
- 加密:
scp
使用 SSH 协议,所有的文件传输都是通过加密的连接进行的,确保了数据的机密性。 - 认证:可以使用密码认证或 SSH 密钥认证,增强了安全性。
# 注意事项
- 权限:
scp
会保留文件的权限,但如果远程服务器上的用户权限不够,可能会导致文件无法正确复制。 - 大文件:对于大文件,
scp
可能不是最优选择,因为它没有像rsync
那样优化传输效率。 - 带宽:可以使用
-l
选项限制带宽,以避免占用过多网络资源。 - 同名文件:当使用
scp
命令传输文件到目的目录时,如果目的目录中已经存在同名文件,scp
默认会覆盖目的目录中的同名文件。使用-n
选项可以防止这种情况发生。
# rsync
rsync是一个远程数据同步工具。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 rsync是一个功能非常强大的工具
它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件。它也可以当作文件复制工具,替代cp
和mv
命令。
rsync
,全称是 remote sync
,字面意思是做远程同步的,但是 rsync
能做的不只是远程同步,它常常用来做文件拷贝、系统备份、远程文件传输。
rsync
最大的的用途是可以做增量备份,即 rsync
在第一次执行备份时,是全量备份(将所有的文件都备份),后面再重新备份时,只会备份哪些修改过的文件。
# 语法
rsync [OPTIONS] SOURCE DESTINATION
选项:
-v, --verbose 详细模式输出。
-q, --quiet 精简输出模式。
-c, --checksum 打开校验开关,强制对文件传输进行校验。
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
-r, --recursive 对子目录以递归模式处理。
-R, --relative 使用相对路径信息。
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀。
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。
-l, --links 保留软链结。
-L, --copy-links 想对待常规文件一样处理软链结。
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结。
--safe-links 忽略指向SRC路径目录树以外的链结。
-H, --hard-links 保留硬链结。
-p, --perms 保持文件权限。
-o, --owner 保持文件属主信息。
-g, --group 保持文件属组信息。
-D, --devices 保持设备文件信息。
-t, --times 保持文件时间信息。
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间。
-n, --dry-run 显示哪些文件将被传输。
-w, --whole-file 拷贝文件,不进行增量检测。
-x, --one-file-system 不要跨越文件系统边界。
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节。
-e, --rsh=command 指定使用rsh、ssh方式进行数据同步。
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息。
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。
--delete 删除那些DST中SRC没有的文件。
--delete-excluded 同样删除接收端那些被该选项指定排除的文件。
--delete-after 传输结束以后再删除。
--ignore-errors 及时出现IO错误也进行删除。
--max-delete=NUM 最多删除NUM个文件。
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输。
--force 强制删除目录,即使不为空。
--numeric-ids 不将数字的用户和组id匹配为用户名和组名。
--timeout=time ip超时时间,单位为秒。
-I, --ignore-times 不跳过那些有同样的时间和长度的文件。
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0。
-T --temp-dir=DIR 在DIR中创建临时文件。
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份。
-P 等同于 --partial。
--progress 显示备份过程。
-z, --compress 对备份的文件在传输时进行压缩处理。
--exclude=PATTERN 指定排除不需要传输的文件模式。
--include=PATTERN 指定不排除而需要传输的文件模式。
--exclude-from=FILE 排除FILE中指定模式的文件。
--include-from=FILE 不排除FILE指定模式匹配的文件。
--version 打印版本信息。
--address 绑定到特定的地址。
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件。
--port=PORT 指定其他的rsync服务端口。
--blocking-io 对远程shell使用阻塞IO。
-stats 给出某些文件的传输状态。
--progress 在传输时显示传输过程。
--log-format=formAT 指定日志文件格式。
--password-file=FILE 从FILE中得到密码。
--bwlimit=KBPS 限制I/O带宽,KBytes per second。
-h, --help 显示帮助信息。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 常用选项
-a
:归档模式,等同于-rlptgoD
,保留符号链接、权限、时间戳等。-v
:详细模式,显示同步过程中传输的文件。-z
:启用压缩传输。-P
:显示进度信息,等同于--progress
和--partial
。--delete
:删除目标目录中源目录不存在的文件。--exclude
:排除特定文件或模式。--include
:包含特定文件或模式。-e
:指定远程shell(如SSH)的命令。
# 基本用法
-a
-a
参数可以替代-r
,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)。rsync -a source destination
1目标目录
destination
如果不存在,rsync 会自动创建。执行上面的命令后,源目录source
被完整地复制到了目标目录destination
下面,即形成了destination/source
的目录结构。如果只想同步源目录
source
里面的内容到目标目录destination
,则需要在源目录后面加上斜杠。rsync -a source/ destination
1上面命令执行后,
source
目录里面的内容,就都被复制到了destination
目录里面,并不会在destination
下面创建一个source
子目录。-n
如果不确定 rsync 执行后会产生什么结果,可以先用
-n
或--dry-run
参数模拟执行的结果。rsync -anv source/ destination
1exclude 和 include
--include
参数用来指定必须同步的文件模式,--exclude
参数指定排除的文件。rsync -av --include="*.txt" --exclude='*' source/ destination
1
远程同步的方法
基本同步语法
# 本地同步到远程 rsync -av source/ username@remote_host:destination # 远程同步到本地 rsync -av username@remote_host:source/ destination
1
2
3
4
5同步目录并显示进度:
rsync -avz --progress /home/user/documents/ user@remote:/backup/documents/
1指定SSH传输:
由于早期 rsync 不使用 SSH 协议,需要用
-e
参数指定协议,后来才改的。所以下面的-e ssh
可以省略rsync -avz -e ssh /path/to/local/source user@remote_host:/path/to/remote/destination/
1但是,如果 ssh 命令有附加的参数,则必须使用
-e
参数指定所要执行的 SSH 命令。rsync -av -e 'ssh -p 2234' /path/to/local/source user@remote_host:/destination
1排除某些文件:
rsync -av --exclude='*.bak' /source/dir/ /destination/dir/
1除了 SSH
rsync
可以作为一个独立的守护进程(rsyncd
)运行,提供rsync
协议服务。这需要在服务器端配置rsyncd.conf
文件,客户端使用--rsh=rsync
选项来连接到这个服务。rsync --rsh=rsync -avz /path/to/local/file rsync://user@remote_host::module/path/to/remote/destination/
1
# 优势
- 高效:通过只传输文件的变化部分,
rsync
非常高效。 - 灵活:支持多种传输协议,适用于不同网络环境。
- 安全性:可以结合 SSH 使用,确保数据传输的安全性。
- 增量备份:适用于备份策略,可以节省存储空间。
- 断点续传:支持断点续传,适合长时间传输任务。
# 对比
基本功能
scp
:
- 基于 SSH 协议的文件传输工具。
- 主要用于将文件或目录从一个主机复制到另一个主机。
- 适合一次性文件传输,不涉及文件内容的检查或同步。
rsync
:
- 文件同步工具,支持增量传输。
- 可以检查源文件和目标文件之间的差异,仅传输变更的部分。
- 支持双向同步,适合频繁更新和备份。
传输效率
scp
:
- 无论目标文件是否存在,每次都会传输整个文件。
- 对于较小的文件或简单传输需求表现良好。
- 传输大文件时性能较差,因为没有增量更新机制。
rsync
:
- 使用“滚动校验”和“块级差异”技术,只传输发生变化的部分。
- 对于重复传输(如备份)表现出色,节省带宽和时间。
- 支持压缩(
-z
参数),进一步减少数据量。
灵活性
scp
:- 功能单一,仅支持文件和目录的拷贝。
- 无法保留文件同步状态,也不支持断点续传。
- 不提供过滤文件或排除特定文件的功能。
rsync
:- 支持多种高级功能:
- 断点续传。
- 保留文件属性(权限、时间戳、符号链接等)。
- 排除或包含特定文件(
--exclude
、--include
参数)。 - 同步整个目录,保持源和目标一致。
- 支持多种高级功能:
错误恢复
scp
:
- 如果传输中断,必须重新开始传输整个文件或目录。
- 对于大文件或不稳定的网络环境,效率较低。
rsync
:
- 支持断点续传(
--partial
参数),可以从中断的地方继续传输。 - 减少重复传输已完成的数据,适合不稳定网络环境。
安全性
scp
:
- 默认通过 SSH 进行加密,安全性高。
- 基于 SSH 的简单文件传输工具,没有额外的安全功能。
rsync
:
- 可以通过 SSH 进行加密(
-e ssh
参数)。 - 与
scp
的安全性相当,但支持更多灵活的认证方式。
应用场景
场景 | 推荐工具 | 原因 |
---|---|---|
单次文件传输 | scp | 简单易用,无需额外配置。 |
大文件首次传输 | scp 或 rsync | 如果不需要增量更新,scp 更简单;否则,rsync 更高效。 |
需要频繁同步 | rsync | 支持增量更新和文件差异比较,节省带宽和时间。 |
不稳定网络环境 | rsync | 支持断点续传,减少中断影响。 |
大量小文件传输 | rsync | 对小文件的处理性能优于 scp ,且支持过滤无关文件。 |
备份和还原 | rsync | 支持文件属性保留、增量同步和目录一致性,特别适合定期备份任务。 |