rsync 中文文档

2020/2/10 linux 命令

rsync - 一个快速、多功能的远程(和本地)文件复制工具

原文地址 (opens new window)

# 概要

本地:

rsync [OPTION...] SRC... [DEST]
1

通过远程 shell 访问

Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
1
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
1
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/
1

这会将与 *.c 匹配的所有文件从当前目录传输到机器 foo 上的目录 src。如果远程系统上已经存在任何文件,则使用 rsync 远程更新协议通过仅发送数据中的差异来更新文件。请注意,命令(*.c)上的通配符扩展为文件列表是由 shell 在运行 rsync 之前处理的,而不是 rsync 本身(与所有其他 posix 样式程序相同)。

rsync -avz foo:src/bar /data/tmp
1

这会将所有文件从机器 foo 上的 src/bar 目录递归地传输到本地机器上的 /data/tmp/bar 目录中。这些文件以“存档”模式进行传输,以确保在传输过程中保留符号链接,设备,属性,权限,所有权等。另外,将使用压缩来减小传输的数据部分的大小。

rsync -avz foo:src/bar/ /data/tmp
1

注意末尾 '/' 的区别

源上的尾斜杠会更改此行为,以避免在目标上创建额外的目录。您可以认为源上尾随 / 的意思是“复制此目录的内容”,而不是“按名称复制目录”,但是在两种情况下,包含目录的属性都将转移到目标位置上的目录。换句话说,以下每个命令都以相同的方式复制文件,包括 /dest/foo 属性的设置:

rsync -av /src/foo /dest
rsync -av /src/foo/ /dest/foo
1
2

还要注意,主机和模块引用不需要斜杠来复制默认目录的内容。例如,这两个都将远程目录的内容复制到 "/dest" 中:

rsync -av host: /dest
rsync -av host::module /dest
1
2

您也可以在仅本地模式下使用 rsync,在该模式下,源和目标名称中均没有 ':'。在这种情况下,它的行为类似于改进的复制命令。

最后,通过去掉模块名,可以列出特定 rsync 守护进程中可用的所有(可列出的)模块

rsync somehost.mydomain.com::
1

有关更多详细信息,请参见以下部分。

# 高级用法

从远程主机请求多个文件的语法是通过指定与第一个相同样式的其他远程主机 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}
1
2
3

较旧的 rsync 版本需要在 SRC 中使用带引号的空格,例如以下示例:

rsync -av host:'dir1/file1 dir2/file2' /dest
rsync host::'modname/dir1/file1 modname/dir2/file2' /dest
1
2

这种字符分割在最新的 rsync 中仍然有效(默认情况下),但不如第一种方法容易使用。

如果您需要传输包含空格的文件名,则可以指定 --protect-args(-s) 选项,或者需要以远程 shell 程序可以理解的方式对空格进行转义。例如:

rsync -av host:'file\ name\ with\ spaces' /dest
1

# 选项摘要(参数列表)

这是 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 注释,请参见下文)
1
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 之后使用)
1
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
1

远程守护程序上的某些模块可能需要身份验证。如果是这样,则在连接时会收到密码提示。通过将环境变量 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/
1
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
1

如果需要指定不同的远程 shell 用户,请记住主机前面的 user@ 前缀指定的 rsync-user 值(对于需要基于用户的身份验证的模块)。这意味着您必须在指定远程 shell 时为 ssh 提供 -l user 选项,如本例中使用 --rsh 选项的简短版本所示:

rsync -av -e "ssh -l ssh-user" rsync-user@host::module /dest
1

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
1

每天晚上都通过 PPP 连接到我的机器 "arvidsjaur" 上的重复目录。

要同步我的 samba 源树,我使用以下 Makefile 目标:

    get:
            rsync -avuzb --exclude '*~' samba:samba/ .
    put:
            rsync -Cavuzb . samba:samba/
    sync: get put
1
2
3
4
5

这使我可以与连接另一端的 CVS 目录同步。然后,我在远程计算机上执行 CVS 操作,由于远程 CVS 协议效率不高,因此节省了大量时间。

我使用以下命令在“旧”和“新” ftp 站点之间镜像目录:

rsync -az -e ssh --delete ~ftp/pub/samba nimbus:"~ftp/pub/tridge"
1

每隔几个小时从 cron 执行一次。

Last Updated: 2023-10-29T08:26:04.000Z