rsync - 一个快速、多功能的远程(和本地)文件复制工具
- 概要
- 描述
- 用法(入门)
- 高级用法
- 选项摘要(参数列表)
- 连接到 RSYNC 守护程序
- 通过远程 SHELL 连接使用 RSYNC-DAEMON 特性
- 启动 RSYNC 后台程序以接受连接
- 有序传输命令
- 示例
# 概要
本地:
rsync [OPTION...] SRC... [DEST]
通过远程 shell 访问
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
2
通过 rsync 守护进程进行访问
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
2
3
4
5
只有一个 SRC
参数而没有 DEST
参数的用法会列出源文件而不是复制。
# 描述
Rsync 是一种快速且用途广泛的文件复制工具。它可以通过任何远程 Shell 在本地复制到另一个主机(或相反),或从另一个远程复制到远程 rsync 守护程序(或相反)。它提供了许多选项来控制其行为的各个方面,并允许非常灵活地指定要复制的文件集。它以其增量传输算法而闻名,该算法通过仅发送源文件与目标中现有文件之间的差异来减少通过网络发送的数据量。Rsync 被广泛用于备份和镜像,并作为日常使用的改进复制命令。
Rsync 使用“快速检查”算法(默认情况下)查找需要传输的文件,该算法查找文件大小或自上次修改时间已更改的文件。当快速检查指示不需要更新文件的数据时,将直接在目标文件上对其他保留的属性进行任何更改(按选项的要求)。
rsync 的一些附加特性是
- 支持复制链接,设备,所有者,组和权限
- 与 GNU tar 类似的排除和排除选项
- CVS 排除模式,用于忽略与 CVS 同样忽略的文件
- 可以使用任何透明的远程 shell,包括 ssh 或 rsh
- 不需要超级用户权限
- 文件传输的流水线以最小化延迟成本
- 支持匿名或已认证的 rsync 守护进程(理想的镜像模式)
# 用法(入门)
使用 rsync 的方式与使用 rcp 的方式相同。您必须指定一个源和一个目的地,其中之一可以是远程的。
也许解释语法的最好方法是举一些例子:
rsync -t *.c foo:src/
这会将与 *.c
匹配的所有文件从当前目录传输到机器 foo 上的目录 src
。如果远程系统上已经存在任何文件,则使用 rsync 远程更新协议通过仅发送数据中的差异来更新文件。请注意,命令(*.c
)上的通配符扩展为文件列表是由 shell 在运行 rsync 之前处理的,而不是 rsync 本身(与所有其他 posix 样式程序相同)。
rsync -avz foo:src/bar /data/tmp
这会将所有文件从机器 foo 上的 src/bar
目录递归地传输到本地机器上的 /data/tmp/bar
目录中。这些文件以“存档”模式进行传输,以确保在传输过程中保留符号链接,设备,属性,权限,所有权等。另外,将使用压缩来减小传输的数据部分的大小。
rsync -avz foo:src/bar/ /data/tmp
注意末尾 '/' 的区别
源上的尾斜杠会更改此行为,以避免在目标上创建额外的目录。您可以认为源上尾随 /
的意思是“复制此目录的内容”,而不是“按名称复制目录”,但是在两种情况下,包含目录的属性都将转移到目标位置上的目录。换句话说,以下每个命令都以相同的方式复制文件,包括 /dest/foo
属性的设置:
rsync -av /src/foo /dest
rsync -av /src/foo/ /dest/foo
2
还要注意,主机和模块引用不需要斜杠来复制默认目录的内容。例如,这两个都将远程目录的内容复制到 "/dest
" 中:
rsync -av host: /dest
rsync -av host::module /dest
2
您也可以在仅本地模式下使用 rsync,在该模式下,源和目标名称中均没有 ':'。在这种情况下,它的行为类似于改进的复制命令。
最后,通过去掉模块名,可以列出特定 rsync 守护进程中可用的所有(可列出的)模块
rsync somehost.mydomain.com::
有关更多详细信息,请参见以下部分。
# 高级用法
从远程主机请求多个文件的语法是通过指定与第一个相同样式的其他远程主机 arg 或省略主机名来完成的。例如,以下都有效:
rsync -av host:file1 :file2 host:file{3,4} /dest/
rsync -av host::modname/file{1,2} host::modname/file3 /dest/
rsync -av host::modname/file1 ::modname/file{3,4}
2
3
较旧的 rsync 版本需要在 SRC 中使用带引号的空格,例如以下示例:
rsync -av host:'dir1/file1 dir2/file2' /dest
rsync host::'modname/dir1/file1 modname/dir2/file2' /dest
2
这种字符分割在最新的 rsync 中仍然有效(默认情况下),但不如第一种方法容易使用。
如果您需要传输包含空格的文件名,则可以指定 --protect-args(-s)
选项,或者需要以远程 shell 程序可以理解的方式对空格进行转义。例如:
rsync -av host:'file\ name\ with\ spaces' /dest
# 选项摘要(参数列表)
这是 rsync 中可用选项的简短摘要。请参考下面的详细描述以获取完整描述。
-v, --verbose 详细模式(增加输出信息)
--info=FLAGS 详细模式信息设置
--debug=FLAGS 详细模式调试设置
--msgs2stderr 调试专用输出处理
-q, --quiet 隐藏非错误消息
--no-motd 隐藏守护模式 MOTD (see caveat)
-c, --checksum 根据校验和,跳过文件,而不是修改时间和大小
-a, --archive 存档模式;等于 -rlptgoD(no -H,-A,-X)
--no-OPTION 关闭隐含选项(例如 --no-D)
-r, --recursive 递归目录
-R, --relative 使用相对路径名称
--no-implied-dirs 不要将隐含的 dirs 与 --relative 一起发送
-b, --backup 备份(请参阅 --suffix 和 --backup-dir)
--backup-dir=DIR 将备份制作成基于 DIR 的层次结构
--suffix=SUFFIX 备份后缀(默认 ~ w/o --backup-dir)
-u, --update 跳过接收方上较新的文件
--inplace 就地更新目标文件
--append 将数据附加到较短的文件中
--append-verify --append w/old data in file checksum
-d, --dirs 传输目录而无需递归
-l, --links 将符号链接复制为符号链接
-L, --copy-links 将符号链接转换为对应的文件/目录
--copy-unsafe-links 只有“不安全的”符号链接被转换
--safe-links 忽略指向树外的符号链接
--munge-links 用符号链接使它们更安全
-k, --copy-dirlinks 将链接目录的符号链接转换为对应目录
-K, --keep-dirlinks 将接收器上的符号链接目录视为目录
-H, --hard-links 保留硬链接
-p, --perms 保留权限
-E, --executability 保持可执行性
--chmod=CHMOD 影响文件和/或目录权限
-A, --acls 保留 ACL(意味着 -p)
-X, --xattrs 保留扩展属性
-o, --owner 保留所有者(仅限超级用户)
-g, --group 保留组
--devices 保留设备文件(仅超级用户)
--specials 保留特殊文件
-D 等同与 --devices --specials
-t, --times 保留修改时间
-O, --omit-dir-times 从 --times 省略目录
-J, --omit-link-times 从 --times 省略符号链接
--super 接收端尝试超级用户活动
--fake-super 使用 xattrs 存储/恢复特权属性
-S, --sparse 将空序列变成稀疏块
--preallocate 写入前分配目标文件
-n, --dry-run 无需更改即可进行试运行
-W, --whole-file 整个复制文件 (w/o delta-xfer algorithm)
--checksum-choice=STR 选择校验和算法
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 强制固定校验和块大小
-e, --rsh=COMMAND 指定要使用的远程 shell
--rsync-path=PROGRAM 指定要在远程计算机上运行的 rsync
--existing 跳过在接收端上创建新文件
--ignore-existing 跳过更新接收端上已存在的文件
--remove-source-files 发送端删除同步源文件(非目录)
--del --delete-during 的别名
--delete 从目标目录中删除无关的文件
--delete-before 接收端在 xfer 之前删除,而不是在传输过程中
--delete-during 接收端在传输过程中删除
--delete-delay find deletions during, delete after
--delete-after 接收端在传输后删除,而不是在传输过程中
--delete-excluded also delete excluded files from dest dirs
--ignore-missing-args ignore missing source args without error
--delete-missing-args delete missing source args from destination
--ignore-errors 即使有 I/O 错误也要删除
--force 即使不为空也强制删除目录
--max-delete=NUM 不要删除超过 NUM 个文件
--max-size=SIZE 不传输任何大于 SIZE 的文件
--min-size=SIZE 不传输任何小于 SIZE 的文件
--partial 保留部分传输的文件
--partial-dir=DIR 将部分传输的文件放入 DIR
--delay-updates 将所有更新的文件放在末尾
-m, --prune-empty-dirs 从文件列表中删除空目录链
--numeric-ids 不要按用户/组名映射 uid/gid 值
--usermap=STRING 自定义用户名映射
--groupmap=STRING 自定义组名映射
--chown=USER:GROUP 简单的用户名/组名映射
--timeout=SECONDS 以秒为单位设置 I/O 超时
--contimeout=SECONDS 设置守护程序连接超时(以秒为单位)
-I, --ignore-times 不要跳过大小和时间匹配的文件
--size-only 跳过大小匹配的文件
-@, --modify-window=NUM 设置 mod-time 比较的准确性
-T, --temp-dir=DIR 在 DIR 目录中创建临时文件
-y, --fuzzy 如果没有目标文件,则查找类似文件作为基础
--compare-dest=DIR 还比较相对于 DIR 的接收文件
--copy-dest=DIR ... 并包括未更改文件的副本
--link-dest=DIR hardlink to files in DIR when unchanged
-z, --compress 传输过程中压缩文件数据
--compress-level=NUM 明确设置压缩级别
--skip-compress=LIST 跳过压缩后缀为 LIST 的文件
-C, --cvs-exclude 自动忽略文件,方法与 CVS 相同
-f, --filter=RULE 添加文件过滤规则
-F 与 --filter='dir-merge /.rsync-filter' 相同
repeated: --filter='- .rsync-filter'
--exclude=PATTERN 排除与 PATTERN 匹配的文件
--exclude-from=FILE 从 FILE 中读取排除格式
--include=PATTERN 不要排除与 PATTERN 匹配的文件
--include-from=FILE 从 FILE 中读取包含格式
--files-from=FILE 从 FILE 中读取源文件名列表
-0, --from0 all *from/filter files are delimited by 0s
-s, --protect-args 没有空间分割;仅通配符
--address=ADDRESS 将传出 socket 的地址绑定到守护程序
--port=PORT 指定双冒号备用端口号
--sockopts=OPTIONS 指定自定义 TCP 选项
--blocking-io 对远程 shell 使用阻塞 I/O
--outbuf=N|L|B 将缓冲设置为 "None","Line" 或 "Block"
--stats 提供一些文件传输统计信息
-8, --8-bit-output 在输出中保留高位字符
-h, --human-readable 以人类可读的格式输出数字
--progress 在转移过程中显示进度
-P 等同与 --partial --progress
-i, --itemize-changes 输出所有更新的变更摘要
-M, --remote-option=OPTION 仅将 OPTION 发送到远程端
--out-format=FORMAT 使用指定的格式输出更新
--log-file=FILE 将我们正在执行的操作记录到指定的 FILE
--log-file-format=FMT 使用指定的 FMT 更新日志
--password-file=FILE 从 FILE 读取守护程序访问密码
--list-only 列出文件而不是复制它们
--bwlimit=RATE 限制 socket I/O 带宽
--write-batch=FILE 将批量更新写入 FILE
--only-write-batch=FILE like --write-batch but w/o updating dest
--read-batch=FILE 从 FILE 读取批量更新
--protocol=NUM 强制使用较旧的协议版本
--iconv=CONVERT_SPEC 请求文件名的字符集转换
--checksum-seed=NUM 设置块/文件校验和种子(高级)
-4, --ipv4 prefer IPv4
-6, --ipv6 prefer IPv6
--version 打印版本号
(-h) --help 显示此帮助(有关 -h 注释,请参见下文)
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
Rsync 也可以作为守护程序运行,在这种情况下,可以接受以下选项:
--daemon 作为 rsync 守护程序运行
--address=ADDRESS 绑定到指定地址
--bwlimit=RATE 限制 socket I/O 带宽
--config=FILE 指定备用 rsyncd.conf 文件
-M, --dparam=OVERRIDE 覆盖全局守护程序配置参数
--no-detach 不要脱离父进程
--port=PORT 侦听备用端口号
--log-file=FILE 覆盖“日志文件”设置
--log-file-format=FMT 覆盖“日志格式”设置
--sockopts=OPTIONS 指定自定义 TCP 选项
-v, --verbose 增加冗长
-4, --ipv4 prefer IPv4
-6, --ipv6 prefer IPv6
-h, --help 显示此帮助(如果在 --daemon 之后使用)
2
3
4
5
6
7
8
9
10
11
12
13
14
# 连接到 RSYNC 守护程序
也可以使用不带远程 shell 程序的 rsync 作为传输。在这种情况下,您将直接连接到远程 rsync 守护程序,通常使用 TCP 873 端口。(这显然要求该守护程序在远程系统上运行,因此,请参阅下面的“启动 RSYNC 守护程序以接受连接”部分以获取有关该信息)。
以这种方式使用 rsync 与在远程 shell 中使用 rsync 相同,除了:
- 您可以使用双冒号 :: 而不是单个冒号将主机名与路径分开,或者使用 rsync//URL。
- “路径”的第一个单词实际上是模块名称。
- 远程守护程序可能会在您连接时打印当天的消息。
- 如果在远程守护程序上未指定任何路径名,则将显示该守护程序上可访问路径的列表。
- 如果您未指定本地目标,则将提供远程守护程序上指定文件的列表。
- 您不得指定 --rsh(-e) 选项。
一个示例将所有文件复制到名为“src”的远程模块中:
rsync -av host::src /dest
远程守护程序上的某些模块可能需要身份验证。如果是这样,则在连接时会收到密码提示。通过将环境变量 RSYNC_PASSWORD
设置为要使用的密码或使用 --password-file
选项,可以避免出现密码提示。在编写 rsync 脚本时,这可能很有用。
警告:在某些系统上,环境变量对所有用户可见。因此推荐使用 --password-file
。
您可以通过将环境变量 RSYNC_PROXY
设置为指向您的 Web 代理的 hostname:port 对来通过 Web 代理建立连接。请注意,您的 Web 代理的配置必须支持到 873 端口的代理连接。
您还可以通过将环境变量 RSYNC_CONNECT_PROG
设置为希望运行的命令来代替直接 socket 连接,从而使用程序作为代理来建立守护程序连接。该字符串可能包含转义符 "%H",以表示 rsync 命令中指定的主机名(因此,如果您的字符串中需要单个“%”,请使用“%%”)。例如:
export RSYNC_CONNECT_PROG='ssh proxyhost nc %H 873'
rsync -av targethost1::module/src/ /dest/
rsync -av rsync:://targethost2/module/src/ /dest/
2
3
上面指定的命令使用 ssh 在代理主机上运行 nc
(netcat),该主机将所有数据转发到目标主机 (%H) 上的端口 873(rsync 守护程序)。
# 通过远程 SHELL 连接使用 RSYNC-DAEMON 特性
有时使用 rsync 守护程序的各种功能(例如命名模块)很有用,而不实际允许任何新的 socket 连接到系统中(允许远程 shell 访问所需的功能除外)。Rsync 支持使用远程 shell 连接到主机,然后生成一个一次性使用的“守护程序”服务器,该服务器希望在远程用户的主目录中读取其配置文件。如果要加密守护程序样式的传输数据,这将很有用,但是由于该守护程序是由远程用户全新启动的,因此您可能无法使用 chroot 等功能或更改该守护程序使用的 uid。(对于加密守护程序传输的另一种方法,请考虑使用 ssh 通过本地端口隧道传输到远程计算机,并在该远程主机上将常规 rsync 守护程序配置为仅允许来自“ localhost”的连接。)
从用户的角度来看,通过远程 shell 连接进行的守护程序传输使用的语法与普通 rsync 守护程序传输几乎相同,唯一的例外是必须在命令行上使用以下命令显式设置远程外壳程序: --rsh=COMMAND
选项。(在环境中设置 RSYNC_RSH
不会打开此功能。)例如:
rsync -av --rsh=ssh host::module /dest
如果需要指定不同的远程 shell 用户,请记住主机前面的 user@ 前缀指定的 rsync-user
值(对于需要基于用户的身份验证的模块)。这意味着您必须在指定远程 shell 时为 ssh 提供 -l user
选项,如本例中使用 --rsh 选项的简短版本所示:
rsync -av -e "ssh -l ssh-user" rsync-user@host::module /dest
ssh-user
将在 ssh 层使用;rsync-user
将用于登录 module
。
# 启动 RSYNC 后台程序以接受连接
为了连接到 rsync 守护程序,远程系统需要已经运行了一个守护程序(或者它已经配置了 inetd 之类的东西来生成 rsync 守护程序用于特定端口上的传入连接)。有关如何启动处理传入 socket 连接的守护程序的完整信息,请参见 rsyncd.conf(5) 手册页-这是该守护程序的配置文件,其中包含有关如何运行该守护程序的完整详细信息( 包括独立配置和 inetd 配置)。
如果您使用远程 shell 传输之一进行传输,则无需手动启动 rsync 守护程序。
# 有序传输命令
Rsync 始终将指定的文件名排序到其内部传输列表中。这样可以将名称相同的目录的内容合并在一起,使删除重复的文件名变得容易,并且当文件的传输顺序与命令行中给出的顺序不同时,可能会使某些人感到困惑。
如果您需要先传输特定文件,则可以将文件分成不同的 rsync 调用,或者考虑使用 --delay-updates
(这不会影响已排序的传输顺序,但会进行最后的文件更新阶段 发生得更快)。
# 示例
以下是一些有关如何使用 rsync 的示例。
为了备份妻子的主目录,该目录包含较大的 MS Word 文件和邮件文件夹,我使用了运行以下命令的 cron 作业
rsync -Cavz . arvidsjaur:backup
每天晚上都通过 PPP 连接到我的机器 "arvidsjaur" 上的重复目录。
要同步我的 samba 源树,我使用以下 Makefile 目标:
get:
rsync -avuzb --exclude '*~' samba:samba/ .
put:
rsync -Cavuzb . samba:samba/
sync: get put
2
3
4
5
这使我可以与连接另一端的 CVS 目录同步。然后,我在远程计算机上执行 CVS 操作,由于远程 CVS 协议效率不高,因此节省了大量时间。
我使用以下命令在“旧”和“新” ftp 站点之间镜像目录:
rsync -az -e ssh --delete ~ftp/pub/samba nimbus:"~ftp/pub/tridge"
每隔几个小时从 cron 执行一次。