rsync 文件同步命令学习

rsync 简介

rsync是可以实现增量备份的工具。配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。

rsync可以实现scp的远程拷贝(rsync不支持远程到远程的拷贝,但scp支持)、cp的本地拷贝、rm删除和"ls -l"显示文件列表等功能。但需要注意的是,rsync的最终目的或者说其原始目的是实现两端主机的文件同步,因此实现的scp/cp/rm等功能仅仅只是同步的辅助手段,且rsync实现这些功能的方式和这些命令是不一样的。事实上,rsync有一套自己的算法,其算法原理以及rsync对算法实现的机制可能比想象中要复杂一些。平时使用rsync实现简单的备份、同步等功能足以,没有多大必要去深究这些原理性的内容。但是想要看懂rsync命令的man文档、使用"-vvvv"分析rsync执行过程,以及实现rsync更强大更完整的功能,没有这些理论知识的支持是绝对不可能实现的。本篇文章将简单介绍rsync的使用方法和它常用的功能。

rsync的目的是实现本地主机和远程主机上的文件同步(包括本地推到远程,远程拉到本地两种同步方式),也可以实现本地不同路径下文件的同步,但不能实现远程路径1到远程路径2之间的同步(scp可以实现)。

不考虑rsync的实现细节,就文件同步而言,涉及了源文件和目标文件的概念,还涉及了以哪边文件为同步基准。

例如,想让目标主机上的文件和本地文件保持同步,则是以本地文件为同步基准,将本地文件作为源文件推送到目标主机上。反之,如果想让本地主机上的文件和目标主机上的文件保持同步,则目标主机上的文件为同步基准,实现方式是将目标主机上的文件作为源文件拉取到本地。当然,要保持本地的两个文件相互同步,rsync也一样能实现,这就像Linux中cp命令一样,以本地某文件作为源,另一文件作为目标文件,但请注意,虽然rsync和cp能达到相同的目的,但它们的实现方式是不一样的。

既然是文件同步,在同步过程中必然会涉及到源和目标两文件之间版本控制的问题,例如是否要删除源主机上没有但目标上多出来的文件,目标文件比源文件更新(newer than source)时是否仍要保持同步,遇到软链接时是拷贝软链接本身还是拷贝软链接所指向的文件,目标文件已存在时是否要先对其做个备份等等。

rsync同步过程中由两部分模式组成:决定哪些文件需要同步的检查模式以及文件同步时的同步模式。

(1).检查模式是指按照指定规则来检查哪些文件需要被同步,例如哪些文件是明确被排除不传输的。默认情况下,rsync使用"quick check"算法快速检查源文件和目标文件的大小、mtime(修改时间)是否一致,如果不一致则需要传输。当然,也可以通过在rsync命令行中指定某些选项来改变quick check的检查模式,比如"--size-only"选项表示"quick check"将仅检查文件大小不同的文件作为待传输文件。rsync支持非常多的选项,其中检查模式的自定义性是非常有弹性的。

(2).同步模式是指在文件确定要被同步后,在同步过程发生之前要做哪些额外工作。例如上文所说的是否要先删除源主机上没有但目标主机上有的文件,是否要先备份已存在的目标文件,是否要追踪链接文件等额外操作。rsync也提供非常多的选项使得同步模式变得更具弹性。

相对来说,为rsync手动指定同步模式的选项更常见一些,只有在有特殊需求时才指定检查模式,因为大多数检查模式选项都可能会影响rsync的性能。

 

同步方式

之前接触过一些同步软件,例如坚果云、百度云盘等等,他们对于同步方式都是有一些选择项的,下面列举一些同步方式

单向同步

每次执行任务时,源目录中新建和更新的文件将被复制到目标目录中;目标目录中对应源目录中已经删除的文件,将被删除。此方式只是单向地对文件进行从源目录到目标目录的操作。如果您手工对目标目录进行的任何文件操作,将被任务忽略。

双向同步#

每次执行任务时,不管源目录还是目标目录中新建和更新的文件都会被复制到另外一个目录中;在任何一个目录中删除文件,另外一个目录也会删除对应的文件。当两个目录中文件的操作重叠时,任务会自动保留最新的操作。如果操作时间无法判断,更新和新建文件的操作会优于删除文件而被保留。此方式会对源目录进行文件操作。

镜像同步#

每次执行任务时,任何在源目录中新建或在目标目录中删除或在两个目录中更新的文件,都会从源目录复制到目标目录。任何在源目录中删除或在目标目录中新建的文件都会从目标目录中删除。此方式始终保持目标目录中的文件和源目录中的文件一模一样,任何目标目录自身的文件变化将被去除。此方式会删除目标目录中多余的文件。

移动同步#

每次执行任务时,源目录中的任何文件都会被移动到目标目录中去。目标目录中如果存在相同文件将被覆盖。移动后,源目录被清空。

更新同步#

每次执行任务时,源目录中新建和更新的文件将被复制到目标目录中,目标目录中任务之前复制的所有文件将被删除,只保留最新的文件。

累加同步#

每次执行任务时,源目录中新建和更新的文件将被复制到目标目录中,目标目录中的任何文件都不会被删除。目标目录中会保留所有在源目录中曾经出现过的文件且都是最后一个版本。

增量备份#

每次执行任务时,任务发现源目录中有新建或更新的文件,则在目标目录中建立一个子目录来保存这些新文件。虽然保存的文件只反映了执行时源目录的一部分,但您可以利用软件中提供的文件恢复工具来恢复出执行时源目录完整的目录结构和所有文件。增量备份任务第一次执行时,会自动对源目录做一次完全备份,以便以后能完全恢复。

完全备份#

每次执行任务时,任务会在目标目录中建立一个子目录来保存源目录中的所有文件。

除双向同步和镜像同步外,其它方式的任务在执行时,如果发现源目录中的文件没有发生变化,将不做任何处理,只会记录一个最后检查时间。双向同步和镜像同步如果碰到源目录和目标目录中的文件都没有变化的情况,也将只记录一个最后检查时间。

除双向同步和镜像同步外,其它方式的任务对于用户直接对目标目录进行新建、更新、删除的文件不做处理。也就是说,不是任务复制到目标目录而存在的文件,任务认为它不存在,不是被任务删除的文件,任务认为文件还在目标目录中存在。

除双向同步和移动同步外,其它方式的任务不会对源目录进行文件操作。

 

Rsync的命令格式可以为以下六种:

Local:  rsync [OPTION...] SRC... [DEST]
 

Access via remote shell:
  Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
 

Access via rsync daemon:
  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

由此语法可知,rsync有三种工作方式:

(1).本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。

(2).本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。

(3).本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。

前两者的本质是通过管道通信,即使是远程shell。而方式(3)则是让远程主机上运行rsync服务,使其监听在一个端口上,等待客户端的连接。

但是,还有第四种工作方式:通过远程shell也能临时启动一个rsync daemon,这不同于方式(3),它不要求远程主机上事先启动rsync服务,而是临时派生出rsync daemon,它是单用途的一次性daemon,仅用于临时读取daemon的配置文件,当此次rsync同步完成,远程shell启动的rsync daemon进程也会自动消逝。此通信方式的命令行语法格式同"Access via rsync daemon",但要求options部分必须明确指定"--rsh"选项或其短选项"-e"。

 

其中,第一个路径参数一定是源文件路径,即作为同步基准的一方,可以同时指定多个源文件路径。最后一个路径参数则是目标文件路径,也就是待同步方。路径的格式可以是本地路径,也可以是使用user@host:path或user@host::path的远程路径,如果主机和path路径之间使用单个冒号隔开,表示使用的是远程shell通信方式,而使用双冒号隔开的则表示的是连接rsync daemon。另外,连接rsync daemon时,还提供了URL格式的路径表述方式rsync://user@host/path。

 

如果仅有一个SRC或DEST参数,则将以类似于"ls -l"的方式列出源文件列表(只有一个路径参数,总会认为是源文件),而不是复制文件。

[root@xuexi ~]# rsync /etc/fstab /tmp                # 在本地同步
[root@xuexi ~]# rsync -r /etc 172.16.10.5:/tmp       # 将本地/etc目录拷贝到远程主机的/tmp下,以保证远程/tmp目录和本地/etc保持同步
[root@xuexi ~]# rsync -r 172.16.10.5:/etc /tmp       # 将远程主机的/etc目录拷贝到本地/tmp下,以保证本地/tmp目录和远程/etc保持同步
[root@xuexi ~]# rsync /etc/                          # 列出本地/etc/目录下的文件列表
[root@xuexi ~]# rsync 172.16.10.5:/tmp/              # 列出远程主机上/tmp/目录下的文件列表

 

 

rsync 参数理解#

  • -a--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
  • -e, --rsh=command 指定所要使用的远程shell程序,默认为ssh。

  • --port      :连接daemon时使用的端口号,默认为873端口。

  • --password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码
  • -r--recursive 对子目录以递归模式处理。
  • -l,--links保留软链结。
  • -L--copy-links 想对待常规文件一样处理软链结。
  • -K--keep-dirlinks treat symlinked dir on receiver as dir
  • -v--verbose 详细模式输出。
  • -z--compress 对备份的文件在传输时进行压缩处理。
  • --progress: 显示传输过程
  • --exclude=PATTERN 指定排除传输的文件模式

  • --delete 同步时,删除那些DST中有,而SRC没有的文件

  • --max-size:限定传输文件大小的上限

  • --dry-run:显示那些文件将被传输,并不会实际传输

  • --bwlimit:限制传输带宽

  •  -W:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效

  • -o --owner:保持owner属性(属主)。
    -g --group:保持group属性(属组)。
    -p --perms:保持perms属性(权限,不包括特殊权限)。
  • -t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新 :检查出mtime不同从而导致增量传输无效。
  • --existing  :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
    
  • --ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。
  • --remove-source-files:要求删除源端已经成功传输的文件。
  •  

    --include=PATTERN 指定需要传输的文件模式

     

-a 选项#

  1. -a 选项是rsync里比较霸道的一个选项,因为你使用-a选项,就相当于使用了 -rlptgoD 这一坨选项。以一敌七,唯 -a选项也。(在看了前文之后,你应该可以很轻松的理解这七个选项的作用了)
  2. -a 选项的学名应该叫做archive option,中文叫做归档选项。使用-a` 选项,就表明你希望采取递归方式来同步,且尽可能的保持各个方面的一致性。
  3. 但是 -a选项也有阿克琉斯之踵,那就是-a无法同步“硬链接”情况。如果有这方面需求,要加上-H选项

 

源目录加了斜线和不加的区别

  • 源目录加了斜线,效果就是将该目录下的内容传输到目标目录下。
  • 源目录不加斜线,效果就是将该目录传输到目标目录下。
  • 目标目录如果不存在,会自动创建目标目录。

 

rsync daemon模式

既然rsync通过远程shell就能实现两端主机上的文件同步,还要使用rsync的服务干啥?试想下,你有的机器上有一堆文件需要时不时地同步到众多机器上去,比如目录a、b、c是专门传输到web服务器上的,d/e、f、g/h是专门传输到ftp服务器上的,还要对这些目录中的某些文件进行排除,如果通过远程shell连接方式,无论是使用排除规则还是包含规则,甚至一条一条rsync命令地传输,这都没问题,但太过繁琐且每次都要输入同样的命令显得太死板。使用rsync daemon就可以解决这种死板问题。而且,rsync daemon是向外提供服务的,这样只要告诉了别人rsync的url路径,外人就能向ftp服务器一样获取文件列表并进行选择性地下载,所以,你所制定的列表,你的同事也可以获取到并使用。

举个简单的例子,Linux内核官网www.kernel.org提供rsync的下载方式,官方给出的地址是rsync://rsync.kernel.org/pub,可以根据这个地址找出你想下载的内核版本。例如要找出linux-3.0.15版本的内核相关文件。

 

rsync daemon是"rsync --daemon"或再加上其他一些选项启动的,它会读取配置文件,默认是/etc/rsyncd.conf,并默认监听在873端口上,当外界有客户端对此端口发起连接请求,通过这个网络套接字就可以完成连接,以后与该客户端通信的所有数据都通过该网络套接字传输。

rsync daemon的通信方式和传输通道与远程shell不同。远程shell连接的两端是通过管道完成通信和数据传输的,即使连接的一端是远程主机,当连接到目标端时,将在目标端上根据远程shell进程fork出rsync进程使其成为rsync server。而rsync daemon是事先在server端上运行好的rsync后台进程(根据启动选项,也可以设置为非后台进程),它监听套接字等待client端的连接,连接建立后所有通信方式都是通过套接字完成的。

注意,rsync中的server的概念从来就不代表是rsync daemon,server在rsync中只是一种通用称呼,只要不是发起rsync请求的client端,就是server端,你可以认为rsync daemon是一种特殊的server,其实daemon更应该称之为service。(之所以解释这一点,是避免各位初学的朋友在阅读man rsync过程中产生误解)

以下是rsync client连接rsync daemon时的命令语法:

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

连接命令有两种类型,一种是rsync风格使用双冒号的"rsync user@host::src dest",一种是url风格的"rsync://user@host:port/src dest"。对于rsync风格的连接命令,如果想要指定端口号,则需要使用选项"--port"。

上述语法中,其中daemon端的路径,如user@host::src,它的src代表的是模块名,而不是真的文件系统中的路径。关于rsync中的模块,相信见了下面的配置文件就会知道是什么意思。

 

daemon配置文件 rsyncd.conf

默认"rsync --daemon"读取的配置文件为/etc/rsyncd.conf,有些版本的系统上可能该文件默认不存在。rsyncd.conf的配置见man rsyncd.conf。以下是部分内容:

[root@xuexi ~]# cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
 
# See rsyncd.conf man page for more options.
 
# configuration example:
 
# uid = nobody
# gid = nobody
# use chroot = yes
# max connections = 4
# pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
 
# [ftp1]
#        path = /home/ftp
#        comment = ftp export area

在上述示例配置文件中,先定义了一些全局选项,然后定义了[ftp1],这个用中括号包围的"[ftp1]"就是rsync中所谓的模块,ftp1为模块ID,必须保证唯一,每个模块中必须定义一项"path",path定义的是该模块代表的路径,例如此示例文件中,如果想请求ftp1模块,则在客户端使用"rsync user@host::ftp1",这表示访问user@host上的/home/ftp目录,如果要访问/home/ftp目录下的子目录www,则"rsync user@host::ftp1/www"。

以下是常见的配置项,也算是一个配置示例:

######### 全局配置参数 ##########
port=888    # 指定rsync端口。默认873
uid = rsync # rsync服务的运行用户,默认是nobody,文件传输成功后属主将是这个uid
gid = rsync # rsync服务的运行组,默认是nobody,文件传输成功后属组将是这个gid
use chroot = no # rsync daemon在传输前是否切换到指定的path目录下,并将其监禁在内
max connections = 200 # 指定最大连接数量,0表示没有限制
timeout = 300         # 确保rsync服务器不会永远等待一个崩溃的客户端,0表示永远等待
motd file = /var/rsyncd/rsync.motd   # 客户端连接过来显示的消息
pid file = /var/run/rsyncd.pid       # 指定rsync daemon的pid文件
lock file = /var/run/rsync.lock      # 指定锁文件
log file = /var/log/rsyncd.log       # 指定rsync的日志文件,而不把日志发送给syslog
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2  # 指定哪些文件不用进行压缩传输
 
###########下面指定模块,并设定模块配置参数,可以创建多个模块###########
[longshuai]        # 模块ID
path = /longshuai/ # 指定该模块的路径,该参数必须指定。启动rsync服务前该目录必须存在。rsync请求访问模块本质就是访问该路径。
ignore errors      # 忽略某些IO错误信息
read only = false  # 指定该模块是否可读写,即能否上传文件,false表示可读写,true表示可读不可写。所有模块默认不可上传
write only = false # 指定该模式是否支持下载,设置为true表示客户端不能下载。所有模块默认可下载
list = false       # 客户端请求显示模块列表时,该模块是否显示出来,设置为false则该模块为隐藏模块。默认true
hosts allow = 10.0.0.0/24 # 指定允许连接到该模块的机器,多个ip用空格隔开或者设置区间
hosts deny = 0.0.0.0/32   # 指定不允许连接到该模块的机器
auth users = rsync_backup # 指定连接到该模块的用户列表,只有列表里的用户才能连接到模块,用户名和对应密码保存在secrts file中,
                          # 这里使用的不是系统用户,而是虚拟用户。不设置时,默认所有用户都能连接,但使用的是匿名连接
secrets file = /etc/rsyncd.passwd # 保存auth users用户列表的用户名和密码,每行包含一个username:passwd。由于"strict modes"
                                  # 默认为true,所以此文件要求非rsync daemon用户不可读写。只有启用了auth users该选项才有效。
[xiaofang]    # 以下定义的是第二个模块
path=/xiaofang/
read only = false
ignore errors
comment = anyone can access

注意:

(1).客户端推到服务端时,文件的属主和属组是配置文件中指定的uid和gid。但是客户端从服务端拉的时候,文件的属主和属组是客户端正在操作rsync的用户身份,因为执行rsync程序的用户为当前用户。

(2).auth users和secrets file这两行不是一定需要的,省略它们时将默认使用匿名连接。但是如果使用了它们,则secrets file的权限必须是600。客户端的密码文件也必须是600。

(3).关于secrets file的权限,实际上并非一定是600,只要满足除了运行rsync daemon的用户可读即可。是否检查权限的设定是通过选项strict mode设置的,如果设置为false,则无需关注文件的权限。但默认是yes,即需要设置权限。

配置完后,再就是提供模块相关目录、身份验证文件等。

[root@xuexi ~]# useradd -r -s /sbin/nologin rsync

[root@xuexi ~]# mkdir /{longshuai,xiaofang}

[root@xuexi ~]# chown -R rsync.rsync /{longshuai,xiaofang}

提供模块longshuai身份验证文件,由于rsync daemon是以root身份运行的,所以要求身份验证文件对非root用户不可读写,所以设置为600权限。

[root@xuexi ~]# echo "rsync_backup:123456" >> /etc/rsyncd.passwd

[root@xuexi ~]# chmod 600 /etc/rsyncd.passwd 

然后启动rsync daemon,启动方式很简单。

[root@xuexi ~]# rsync --daemon

如果是CentOS 7,则自带启动脚本。

[root@xuexi ~]# systemctl start rsyncd

看看该脚本的内容。

[root@xuexi ~]# cat /usr/lib/systemd/system/rsyncd.service
[Unit]
Description=fast remote file copy program daemon
ConditionPathExists=/etc/rsyncd.conf
 
[Service]
EnvironmentFile=/etc/sysconfig/rsyncd
ExecStart=/usr/bin/rsync --daemon --no-detach "$OPTIONS"
 
[Install]
WantedBy=multi-user.target

可以看到启动方法也仅仅只是多了一个"--no-detach",该选项表示rsync不将自己从终端上剥离。

总之,启动好rysnc daemon后,它就监听在指定的端口上,等待客户端的连接。

由于上述示例中的模块longshuai配置了身份验证功能,所以客户端连接时会询问密码。如果不想手动输入密码,则可以使用"--password-file"选项提供密码文件,密码文件中只有第一行才是传递的密码,其余所有的行都会被自动忽略。

例如在客户端上:

[root@xuexi ~]# echo "123456" > /tmp/rsync_passwd

然后使用该"--password-file"连接需要身份验证的longshuai模块。

[root@xuexi ~]# echo "123456" > /tmp/rsync_passwd

如果需要访问模块中的某个文件,则:

[root@xuexi ~]# rsync --list-only --port 888 [email protected]::longshuai/a/b --password-file=/tmp/rsync_passwd

还可以使用url格式语法:

[root@xuexi ~]# rsync --list-only rsync://[email protected]:888/longshuai/a/b --password-file=/tmp/rsync_passwd

远程shell方式连接使用daemon

在前文说了rsync有三种工作方式:本地同步模式、远程shell模式和rsync daemon模式。前两者是使用管道进行通信和传输数据的,后者是通过网络套接字进行通信和传输数据的,且rsync daemon要求在server端必须已经运行好rsync且监听在指定端口上。

但rsync支持第4种工作方式:通过远程shell方式连接rsync daemon。也就是将第二种和第三种方式结合起来。虽然这种方式用的不多,但还是有必要稍微解释下,为你阅读rsync的man文档提供一些帮助。

为了下面称呼的方便,暂且将通过远程shell连接使用daemon的方式成为"远程shell daemon",当然,官方并没有这样的术语,仅仅只是本人在此为了方便而如此称呼。

远程shell daemon的方式严格地说是"远程shell通信方式+使用rsync daemon的功能"。所以它的通信方式和远程shell是一样的,在客户端发起远程shell连接,在server端fork远程shell进程以启动rsync进程,但这个rsync进程是临时的rsync daemon,它只读取配置文件中client所请求的模块部分,且只读取模块部分中的path和身份认证相关内容,(也就是说不会将全局配置项和其它模块项加载到内存,该模块下的其他配置也不会生效),当rsync操作完成,该rsync daemon就消逝并从内存中被清理。而且,远程shell daemon启动的临时daemon不会和已经在server端运行的rsync daemon冲突,它们可以并存。由于远程shell连接的最终目标是rsync模块,所以它只能使用rsync daemon语法。

以下是语法格式:为了简洁,没有指定src还是dest,且以ssh这个远程shell为例。

rsync [options] --rsh=ssh auth_user@host::module

rsync [options] --rsh="ssh -l ssh_user" auth_user@host::module

rsync [options] -e "ssh -l ssh_user" auth_user@host::module

rsync [options] -e "ssh -l ssh_user" rsync://auth_user@host/module

涉及了两个用户ssh_user和auth_user,由于使用的是远程shell通信方式,所以client要和server端建立ssh连接,ssh_user就是ssh连接server的用户。auth_user则是模块中的身份认证用户。如果不指定"ssh_user",则默认将使用auth_user,但很多时候auth_user都只是一个虚拟用户,这样就建立不了ssh连接导致失败,所以建议明确指定ssh_user和auth_user。

举个例子就能说明上面的一切。以下是server端配置文件/etc/rsyncd.conf中的一个模块配置,稍后将从client端使用远程shell方式请求该模块。

[tmpdir]
path=/tmp
auth users=lisi
secrets file=/tmp/lisi_passwd

当前server端是没有rsync daemon在运行的。

[root@xuexi ~]# netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN    
tcp6       0      0 :::22                   :::*                    LISTEN    
tcp6       0      0 ::1:25                  :::*                    LISTEN

在客户端上使用以下命令:

[root@xuexi ~]# rsync --list-only -e "ssh -l root" [email protected]::tmpdir
[email protected]'s password:
 
Password:

可以看到要求输入两次密码,第一次密码是root@XXX的密码,即建立ssh连接使用的密码,只有建立了ssh连接,才能在server上启动临时rsync daemon。第二次输入的密码Password是"auth users=lisi"对应的密码。

 

参考:https://www.cnblogs.com/f-ck-need-u/p/7220009.html#blog21

 

你可能感兴趣的:(rsync 文件同步命令学习)