1、rsync:通过服务器/客户端CS模式,可以理解为:在远程主机上建立一个rsync的服务器,在服务器配置好rsync的各种应用配置,然后将本机作为rsync的一个客户端连接远程的rsysc服务器:
需要先在服务端开启一个rsync服务,并且要监听的端口(默认873):
开启服务之前需要编辑/etc/rsyncd.conf文件,将服务添加进去,然后启动服务:“rsync --deamon”(服务名称),进行同步:
或者将配置文件写入到一个文件,使用“rsync --configure”进行同步,配置完成后客户端可以通过制定端口和服务器通信:
配置案列:有A(服务端)和B(客户端)两台机器,首先编辑A机器的配置文件:
A机器的配置文件: /etc/rsyncd.conf
[root@localhost_001 ~]# cat /etc/rsyncd.conf #服务端rsync的主配置文件
port=873
#指定启动rsync服务的端口,默认问873端口:
log file=/var/log/rsync.log
#指定日记文件:
pid file=/var/run/rsyncd.pid
#指定pid文件,这个文件的作用涉及服务的启动和停止等进程操作:
address=192.168.133.130
#指定启动rsync的服务的IP,假如你的机器有多个IP,可以指定其中一个IP来启动rsync服务,如果不指定该参数,默认是在全部IP上启动:
[test]
#指定模块名,里面的内容自定义:
path=/tmp/rsync
#指定数据存放的路径:安全参数:
use chroot=true
#use chroot=true/flase 安全参数,在传输文件先chroot到path目录,实现安全防护:典型文件是软连接,如果设置为true,则加大L源文件无法复制,所以有软连接时建议设置为flase:
#设置为true:推拉文件时,只能限定在PATH这个目录下活动:
#设置为flase:不限定在PATH这个目录里:
max connections=4
#指定客户端连接的最大连接数,默认为0,则不限制:
read only=no
#read only=true|flase 如果为true,则不能上传文件到该模块指定目录下:推数据的时候使用:
list=true
#list=true|flase 当用户查询该服务上的模块,该模块会列出,设定true则列出,flase则隐藏:
uid=root
gid=root
#表示传输时文件以那个用户和组的身份来传输:
auth users=test
#指定传输要使用的用户名:如果注释掉则不生效,传输s时无需密码验证:
secrets file=/etc/rsyncd.passwd
#指定密码文件,该参数同上面的参数结合使用,如果不指定,则不适用密码验证:
建议改密码权限设置为600, 文件格式 “用户名:密码”
hosts allow=192.168.149.130
表示允许那些客户端主机来连接本模块的服务,可以是IP或者网段,如果是多个,中间用空格隔开:
注释:当设置了auth users和secrets file后,客户端连接服务端需要输入密码,可有时候使用脚本时,输入密码太繁琐了:
方法:可以在客户端主机里/etc/rsync_pass.txt文件里写入密码,权限改为600,当再执行:不再需要输入密码:
rsync -avP /tmp/test/ --Port 1121 --password-file=/etc/rsync_pass.txt test@192.168.149.129::test
--Port:配置文件里第一行可以自定义rsync端口后,当客户端连接时,则需要通过”--Port 1121“指定端口:
::tset:表示一个模块的名称,在配置文件里定义的:
2:启动rsync服务: rsync --daemon
[root@localhost_001 ~]# rsync --daemon #启动服务
[root@localhost_001 ~]# ps aux |grep rsync #查看相关进程:
root 1778 0.0 0.0 114696 536 ? Ss 23:54 0:00 rsync --daemon
root 1782 0.0 0.0 112676 984 pts/0 S+ 23:54 0:00 grep --color=auto rsync
[root@localhost_001 ~]# netstat -lnp |grep rsync #查看rsync的端口号:
tcp 0 0 192.168.149.129:873 0.0.0.0:* LISTEN 1778/rsync
案列1:B机器(客户端)给A机器(服务端)上传文件:推文件:rsync -avP test/ 192.168.149.129::test/
[root@localhost_002 ~]# rsync -avP test1/ 192.168.149.129::test/ #本地到远端主机
rsync: failed to connect to 192.168.149.129 (192.168.149.129): No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
#会提示错误路由不可以达:排除思路: ping---->监听端口---->tenet Ip 873---->iptables
[root@localhost_002 ~]# systemctl stop iptables #关闭防火墙
[root@localhost_002 ~]# rsync -avP test1/ 192.168.149.129::test/ #从本地到远端主机
sending incremental file list
./
123
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=7/9)
2112 -> 123
234
0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=5/9)
4356
0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=4/9)
567
0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=3/9)
bac.txt -> /tmp/ipt.txt
sent 382 bytes received 113 bytes 90.00 bytes/sec
total size is 15 speedup is 0.03
A机器查看文件:
[root@localhost_001 ~]# ls /tmp/test/
2112 234 4356 567 dir1 dir2
案列2:B机器(客户端)到A机器(服务端)去下载文件:拉文件: rsync -avP 192.168.148.129::test/ /root/
[root@localhost_002 ~]# rsync -avP 192.168.149.129::test/ /tmp/test22 #远端到本机
receiving incremental file list
created directory /tmp/test22
./
123
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=7/9)
2112 -> 123
234
0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=5/9)
4356
0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=4/9)
567
0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=3/9)
bac.txt -> /tmp/ipt.txt
dir1/
dir2/
sent 121 bytes received 378 bytes 998.00 bytes/sec
total size is 15 speedup is 0.03
注释:有时rsync服务同步时无法同步:简单排查思路如下:
#会提示错误路由不可以达:排除思路: ping---->监听端口---->tenet Ip 873---->iptables
[root@localhost_001 ~]# ping 192.168.149.130 #ping测试:
PING 192.168.149.130 (192.168.149.130) 56(84) bytes of data.
64 bytes from 192.168.149.130: icmp_seq=1 ttl=64 time=5.86 ms
64 bytes from 192.168.149.130: icmp_seq=2 ttl=64 time=0.224 ms
--- 192.168.149.130 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.224/3.046/5.868/2.822 ms
[root@localhost_001 ~]# ps aux |grep rsync #查看其服务是否开启:
root 1778 0.0 0.0 114696 536 ? Ss 8月14 0:00 rsync --daemon
root 2002 0.0 0.0 112676 984 pts/0 S+ 01:41 0:00 grep --color=auto rsync
[root@localhost_001 ~]# netstat -lnp |grep rsync #查看其端口:
tcp 0 0 192.168.149.129:873 0.0.0.0:* LISTEN 1778/rsync
[root@localhost_001 ~]# telnet 192.168.149.129 873 #telnet其端口:
Trying 192.168.149.129...
Connected to 192.168.149.129.
Escape character is '^]'.
@RSYNCD: 31.0
^]
telnet> quit
Connection closed.
#先用crtl+]结束,在用quit退出telnet:
[root@localhost_001 ~]# iptables -nvL #查看其防火墙是否关闭:
案例3:修改A机器(服务端)的配置:use root=flase(不受PATH目录限制): ture:只能限制的PATH的目录下:
我们以软连接为列,当其他目录有软连接在此目录下,则传输时是否会传输源文件,如下:
首先将use chroot=true # 限定在PATH=/tmp/rsync/目录下: 传输时软连接会提示错误:
A机器(服务端配置):
[root@localhost_001 tmp]# ls -l /tmp/rsync/bac.txt
lrwxrwxrwx 1 root root 12 8月 15 00:54 bac.txt -> /tmp/ipt.txt
#定义模块的目录下有一个ipt的软连接文件在这里:
[root@localhost_001 tmp]# vim /etc/rsyncd.conf
use chroot=true #限制在/tmp/test/目录下:
B机器上再次拷贝,看软连接源文件是否会被拷贝过来:
[root@localhost_002 ~]# rsync -avLP 192.168.149.129::test/ /tmp/test/
receiving incremental file list
symlink has no referent: "/bac.txt" (in test)
symlink has no referent: "/111/test1/bac.txt" (in test)
symlink has no referent: "/test1/bac.txt" (in test)
created directory /tmp/test
sent 352 bytes received 1,291 bytes 252.77 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1650) [generator=3.1.2] #提示报错:
#这样bac.txt会报错红色,提示文件不能用:
然后将use chroot=false #不限定PATH=/tmp/rsync/目录下: 软连接可以正常传输过去:
A机器(服务端)
[root@localhost_001 tmp]# vim /etc/rsyncd.conf
use chroot=false #不想定在PATH目录:
B机器(客户端)
[root@localhost_002 ~]# rsync -avL 192.168.149.129::test/ /tmp/test/
receiving incremental file list
created directory /tmp/test
sent 409 bytes received 2,949 bytes 6,716.00 bytes/sec
total size is 1,617 speedup is 0.48
[root@localhost_002 test]# ls -l /tmp/test/bac.txt
-rw-r--r-- 1 root root 539 8月 10 10:32 /tmp/test/bac.txt
4:有时当服务器的端口号发生变化,则再拷贝是需要手动指定端口: --port 8730
#指定端口也在/etc/rsyncd.conf文件里:
安装killall命令: yum install -y psmisc
A机器服务端:
[root@localhost_001 ~]# netstat -lnp|grep rsync #查看监听端口
tcp 0 0 192.168.149.129:8730 0.0.0.0:* LISTEN 1533/rsync
[root@localhost_002 ~]# rsync -avL --port 8730 192.168.149.129::test /tmp/test/
receiving incremental file list
bac.txt
111/test1/bac.txt
test1/bac.txt
sent 98 bytes received 2,338 bytes 1,624.00 bytes/sec
total size is 1,617 speedup is 0.66
5:在/etc/rsyncd.conf配置文件里:list=true(列出模块) | false (不列出模块) :如下:
A机器(服务端)
[root@localhost_001 ~]# vim /etc/rsyncd.conf
list=true
B机器(客户端)
[root@localhost_002 ~]# rsync --port=8730 root@192.168.149.129::
test
A机器(服务端)
[root@localhost_001 ~]# vim /etc/rsyncd.conf
list=false
B机器(客户端)
[root@localhost_002 ~]# rsync --port=8730 root@192.168.149.129::
6:在/etc/rsyncd.conf配置文件里,也也支持验证同步,也就是说需要输入用户名和密码才能验证:如下:
A机器(服务器端)
[root@localhost_001 ~]# cat /etc/rsyncd.conf |grep -v ^# |grep -v ^$
port=8730
log file=/var/log/rsync.log
pid file=/var/run/rsyncd.pid
address=192.168.149.129
[test]
path=/tmp/rsync
use chroot=false
max connections=4
read only=no #允许用户给此模块目录上传文件:
list=true
uid=root
gid=root
auth users=test #验证的用户名
secrets file=/etc/rsyncd.passwd #验证的密码配置文件:
hosts allow=192.168.149.130 #多个IP用空格隔开,也可以是一个网段:
[root@localhost_001 ~]# cat /etc/rsyncd.passwd
test:nihao123 #格式为: 用户名:密码
#需要修改其权限为600:
[root@localhost_001 ~]# chmod 600 /etc/rsyncd.passwd
注释:rsync.passwd的密码配置文件/etc/rsyncd.passwd:格式为:用户名:密码
B机器(客户端测试):
[root@localhost_002 ~]# rsync -avL /tmp/test/ --port 8730 test@192.168.149.129::test
Password:
sending incremental file list
sent 560 bytes received 21 bytes 232.40 bytes/sec
total size is 1,617 speedup is 2.78
7:如果有时想写成脚本验证的方式,不人为的输入密码:则如下操作: --password-file=/etc/rsyncd_pass.txt
1、首先在客户端机器创建一个密码文件,用以验证A机器的密码: 然后并给600的权限:
[root@localhost_002 ~]# cat /etc/rsyncd_pass.txt
12345
[root@localhost_002 ~]# chmod 600 /etc/rsyncd_pass.txt
2、然后在客户端侧往服务器侧推文件上去:
[root@localhost_002 ~]# rsync -avP /tmp/test/ --port=8730 --password-file=/etc/rsyncd_pass.txt test@192.168.149.129::test
sending incremental file list
sent 560 bytes received 21 bytes 387.33 bytes/sec
total size is 1,617 speedup is 2.78
总结:rsync报错总结:
客户端报错:
[root@localhost_002 test]# rsync -avP 192.168.149.129::test/ /tmp/test/
rsync: getcwd(): No such file or directory (2)
rsync error: errors selecting input/output files, dirs (code 3) at util.c(1058)
[Receiver=3.1.2]
需要用用exit退出当前终端,并重新进入shell即可:
2:有时重启rsync起不来:报错如下:
[root@localhost_001 ~]# rsync --daemon
[root@localhost_001 ~]# failed to create pid file /var/run/rsyncd.pid: File exists
rm -fr /var/run/rsyncd.pid
则需要kaill -9 PID号,然后重新启动rsync即可: ==== killall rsync
3:有时使用密码验证时,报错如下:
[root@localhost_002 ~]# rsync -avL /tmp/test/ --port=8730 test@192.168.149.129::test
Password:
@ERROR: auth failed on module test
rsync error: error starting client-server protocol (code 5) at main.c(1648) [sender=3.1.2]
拍错思路:检查rsyncd.conf的配置文件--->密码是否正确----->密码文件的权限必须600: