rsync的应用

2024-09-01 22:58
文章标签 应用 rsync

本文主要是介绍rsync的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



rsync是一个远程同步工具,可以在本主机,或者在远程主机上完成数据远程同步,基于rsync算法,检测本主机,或者远程主机源目标之间的数据是否相同,来完成数据同步.

特点:
        1、可以镜像保存整个目录树或文件系统;
        2、较高的数据传输效率;
        3、可以借助于ssh实现安全数据传输;
        4、支持匿名传输;

rsync命令的工作模式:
        第一种模式:shell模式,也称作本地模式;类似cp 命令,但是它仍然基于rsync算法做比较,效率不及cp,所以它不能完全代替cp命令
        第二种模式:远程shell模式,可以利用ssh协议承载其远程传输过程;可以实现安全传输
        第三种模式:列表模式,仅列出源中的内容,-nv
        第四种模式:服务模式,此时rsync工作为守护进程,能接收客户端的数据同步请求;也可以为客户端更新数据, 能push,pull

rsync命令的选项:
        -n: 同步测试,不执行真正的同步过程;
        -v: 详细输出模式
        -q: 静默模式
        -c: checksum,开启校验功能
        -r: 递归复制 

        -a: 归档,保留文件的原有属性;
        -p: 保留文件的权限;
        -t: 保留文件的时间戳;
        -l: 保留符号链接
        -g: 保留属组
        -o: 保留属主
        -D:保留设备文件

        -e ssh: 使用ssh作为传输承载;
        -z: 压缩后传输;

        --progress: 显示进度条
        --stats: 显示如何执行压缩和传输

注意:rsync命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本向;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;

 

例1: 我们将 /etc/passwd 同步到 /tmp 下, 加 –n 选项,仅做测试

[root@mode_11 ~]# rsync -nv /etc/passwd /tmp/      加  -n 选项,仅做测试
passwd

sent 30 bytes  received 15 bytes  90.00 bytes/sec
total size is 1623  speedup is 36.07 (DRY RUN)  =>显示 DRY RUN 就表示仅做测试
[root@mode_11 ~]# ls /tmp/     =>查看 /tmp 目录, 没有passwd文件
my.repo

[root@mode_11 ~]# rsync -v /etc/passwd /tmp/
passwd

sent 1693 bytes  received 31 bytes  3448.00 bytes/sec
total size is 1623  speedup is 0.94
[root@mode_11 ~]# ls /tmp     =>去掉 n 选项后,passwd文件就同步过来了
my.repo  passwd

 

例2, 拷贝 /etc/profile.d 目录,看 加/ 与不加的区别

[root@mode_11 ~]# rsync -r /etc/profile.d/ /tmp/test   =>源目录加/
[root@mode_11 ~]# ls /tmp/test/                       ==>很明显,是将 /etc/profile.d 目录下所有的文件都拷过来
colorls.csh  cvs.csh  glib2.csh  gnome-ssh-askpass.csh  lang.csh  less.csh  qt.csh  udisks-bash-completion.sh  vim.sh
colorls.sh   cvs.sh   glib2.sh   gnome-ssh-askpass.sh   lang.sh   less.sh   qt.sh   vim.csh  

 

[root@mode_11 ~]# rsync -r /etc/profile.d /tmp/test   ==>源目录不加 /
[root@mode_11 ~]# ls /tmp/test/
colorls.csh  cvs.sh     gnome-ssh-askpass.csh  lang.sh   profile.d  udisks-bash-completion.sh  which2.sh
colorls.sh   glib2.csh  gnome-ssh-askpass.sh   less.csh  qt.csh     vim.csh
cvs.csh      glib2.sh   lang.csh               less.sh   qt.sh      vim.sh

 

我们再开一台虚拟机, 用rsync 传输测试一些大文件

-e ssh: 使用ssh作为传输承载;
-z: 压缩后传输;

--progress: 显示进度条

例,本机是 172.16.26.6,将本机上的 /etc 目录,递归并以压缩的方式发送到 172.16.26.11主机上的/tmp/test目录下

[root@php5_6 src]# rsync -rz /etc root@172.16.26.11:/tmp/test

[root@mode_11 ~]# ls /tmp/test/
etc

 

例,传送一个大文件,演示—stats   以及 –progress 选项的效用

image

[root@php5_6 src]# rsync -rz -e ssh --stats --progress /tmp/all.tar.gz root@172.16.26.11:/tmp/test
root@172.16.26.11's password:
sending incremental file list
all.tar.gz
   119062528 100%   18.07MB/s    0:00:06 (xfer#1, to-check=0/1)

Number of files: 1
Number of files transferred: 1
Total file size: 119062528 bytes
Total transferred file size: 119062528 bytes
Literal data: 119062528 bytes
Matched data: 0 bytes
File list size: 25
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 119102576
Total bytes received: 31

sent 119102576 bytes  received 31 bytes  10356748.43 bytes/sec
total size is 119062528  speedup is 1.00   ==>输送的结果

 

在目标主机上查看,文件是否传输过来

[root@mode_11 ~]# ls /tmp/test/
all.tar.gz  etc

那么远程传输到本地呢?也很简单,我们把刚才发送过去的 all.tar.gz文件同步回来

image

 

以压缩的方式,并用ssh安全的将11主机上的/tmp/test/all.tar.gz 同步到本地的/root目录下

[root@php5_6 src]# rsync -rz -e ssh --stats --progress  root@172.16.26.11:/tmp/test/all.tar.gz /root/
root@172.16.26.11's password:
Permission denied, please try again.
root@172.16.26.11's password:
receiving incremental file list
all.tar.gz
   119062528 100%   22.93MB/s    0:00:04 (xfer#1, to-check=0/1)

Number of files: 1
Number of files transferred: 1
Total file size: 119062528 bytes
Total transferred file size: 119062528 bytes
Literal data: 119062528 bytes
Matched data: 0 bytes
File list size: 25
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 30
Total bytes received: 119102581

sent 30 bytes  received 119102581 bytes  8213973.17 bytes/sec
total size is 119062528  speedup is 1.00  ==>同步回本地的结果

[root@php5_6 src]# ls /root
all.tar.gz       apr-1.5.0       bincp.sh        busybox-1.22.1.tar.bz2  httpd-2.4.6  install.log.syslog   nginx-1.4.7         pcre-8.35       

同步结果已然在目标目录中

 

验证rsync的同步工作机制

删除11主机上的/tmp/test/etc下的两个文件

[root@mode_11 test]# rm -f etc/man.config etc/issue

测试同步时,是否只是同步这两个文件

[root@mode_11 test]# rsync -zr -e ssh --stats --progress root@172.16.26.6:/etc /tmp/test/

skipping non-regular file "etc/ssl/certs" ==>例如,如果目标位置,文件已存在,会显示 skipping跳过

etc/issue                       ==>需要同步的,则会显示 传输的进度和速率
          47 100%   45.90kB/s    0:00:00 (xfer#1, to-check=1183/1227)
etc/man.config
        4963 100%    4.73MB/s    0:00:00 (xfer#2, to-check=1168/1227)


rsync 的服务器模式

例,我们将172.16.26.11 作为rsync服务器端

[root@mode_11 xinetd.d]# mkdir /data =>创建一个目录,作为rsync的数据同步目录

rsync 平时访问比较少,所以它是委托xinetd 超级守护进程监听

yum install xinetd =>如果超级守护进程没安装,执行该命令安装

如果超级守护进程已安装,在 /etc/xinetd.d目录下,会有一个 rsync 的配置文件

[root@mode_11 test]# cd /etc/xinetd.d/
[root@mode_11 xinetd.d]# ls

chargen-dgram   daytime-dgram   discard-dgram   echo-dgram   rsync

将 rsync 文件中的 disable 选项,改为no,以开启 rsync服务器模式

disable = no

2、为rsync提供配置文件
            /etc/rsyncd.conf 

配置文件分两段:
全局配置段:1个
共享配置段:多个           
    [SHARE_NAME]

配置示例:
# Global Settings 全局配置
uid = nobody
gid = nobody                     =>运行身份
use chroot = no                  =>是否切换根路径运行
max connections = 10         =>最大并发连接数
strict modes = yes                   =>是否是严格模式,检查权限是否能上传,下载等
pid file = /var/run/rsyncd.pid    =>运行的pid
log file = /var/log/rsyncd.log    =>运行日志

# Directory to be synced
[mydata]
path = /data                         =>共享工作目录
ignore errors = yes                => 是否忽略错误[如传输过程中,某一文件出现错误]
read only = no                     =>是否只读
write only = no                    => 是否只可上传, 别人不能看
hosts allow = 172.16.0.0/16   =>订义能访问的列表
hosts deny = *                     => 出了能匹配到的,都不允许
list = false                           =>是否允许列出共享目录列表  
uid = root                           => 共享用户,专门针对这个共享的身份配置
gid = root                           =>共享组, 也是专门针对 rsync 服务订义的

 

注,该服务监听在tcp的873 端口

 

rsync有两种工作模式,一种是从远程服务器上推送数据,另一种是将数据从服务器上更新到本地

例,我们在服务端的主机上的rsync服务目录是 /data

  将本地的文件,推送到服务器上的mydata共享上

[root@php5_6 ~]# rsync bincp.sh 172.16.26.11::mydata

查看服务器上的共享目录

[root@mode_11 ~]# cd /data/
[root@mode_11 data]# ls
a.txt  bincp.sh          =>OK,共享成功

那么,要将rsync服务器上的文件同步到本地,该怎么做呢

[root@php5_6 tmp]# rsync -a 172.16.26.11::mydata/ ./    =>将服务器上的文件同步到本地的当前目录下, 
[root@php5_6 tmp]# ls
a.txt  bincp.sh                    ==>同步OK

如果只想同步某一指定文件,需要在共享目录名称后,加上具体文件名字

[root@php5_6 tmp]# rsync 172.16.26.11::mydata/a.txt ./       =>清空本地/tmp目录, 同步远程服务器上的 mydata共享的a.txt文件
[root@php5_6 tmp]# ls
a.txt

 

在服务器端,单纯的以ip地址段来设定访问权限,不灵活,也不安全,还可以实现以用户认证的方式,来限制访问权限

让服务器端提供用户认证功能

在/etc/rsyncd.conf 主配置文件中

添加如下两行

auth users = robert,judy               ==>认证用户名单
secrets file = /etc/rsyncd.passwd    ==> 配置认证用户密码 , 注意,认证的密码不能超过8位数

 

[root@mode_11 xinetd.d]# vim /etc/rsyncd.passwd =>编辑密码文件

robert:abcabc
judy:abcabc

 

密码认证文件的权限必须是600,否则重启服务会失败

[root@mode_11 xinetd.d]# chmod 600 /etc/rsyncd.passwd

[root@mode_11 xinetd.d]# service xinetd restart  =>重启超级守护进程

 

从远程服务器同步数据到本地

[root@php5_6 tmp]# rsync judy@172.16.26.11::mydata/abc.abc ./   =>同步远程共享目录下的abc.abc文件到本地
Password:                                  =>输入正确密码
[root@php5_6 tmp]# ls
abc.abc    =>OK, 数据同步成功

 

本地推送数据到服务器端

[root@php5_6 tmp]# touch my.rsync         =>在本地创建一个文件
[root@php5_6 tmp]# rsync my.rsync judy@172.16.26.11::mydata      =>推送到服务器上
Password:                              =>输入正确的认证密码

 

去服务器端检查

[root@mode_11 xinetd.d]# ls /data/
abc.abc  a.txt  bincp.sh my.rsync   ==>ok, 文件推送成功

要实现主rsync服务器的数据和 从rsync服务器的数据同步,那该怎么办呢?

我们可以使用一个 inotify 的工具来时时监听 共享目录下的数据是否发生变化,如有变化,则利用脚本,推送给从节点

 

  image 下载安装文件,解压后配置安装

[root@mode_11 inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify

[root@mode_11 inotify-tools-3.14]#  make && make install

安装完成后,使用该工具监听 /data目录, 体验一下 inotify的功用 

[root@mode_11 bin]# /usr/local/inotify/bin/inotifywait -mrq -e modify,delete,create,attrib /data

/data/ CREATE b.txt

/data/ ATTRIB b.txt

/data/ DELETE a.txt

另开一个终端,在/data 目录里,创建,删除文件等操作, 上述监听都能监测到

有了这个监听保证,我们可以写一个脚本,让它开机自动运行,就能实现rsync作为主服务器数据发生变化后

向从服务器推送数据了.

在主服务器 11 上生成密钥

[root@mode_11 ~]# ssh-keygen -t rsa   ==>让输入密码时一路按回车[即,使用空密码生成密钥]

image

进入 /root/.ssh/查看 id_rsa.pub 文件 ,   将这个文件发送到要同步的主机上,并添加到 相应的 /root/.ssh/authorized_keys文件中

image

将生成的公钥文件传到要同步的主机上

[root@mode_11 .ssh]# rsync id_rsa.pub root@172.16.26.6:/root

root@172.16.26.6's password:   =>正确输入目标主机密码,文件就可以传输过去了

将该文件的内容导入到 /root/ .ssh/authorized_keys 中

[root@php5_6 ~]# cat id_rsa.pub > .ssh/authorized_keys

[root@php5_6 ~]# cat .ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqm/kmH8IJ2aI1mw2Q1zpHTWCY3XvX4XzvRQSG4cpcp8g3uEE6kf00Wm2HaLOZ3qK1ZbgbiNzUrd8fPPDYjRjc0Pz70ehyXnmkQEIsphRM7WFMmeruVjmWe47d7JfT/5fHsqgEJLHxOaN9fTDEn1jy5CPljp0oARg8gBvKlR9TIBiE1yGmncsYBwoan99kpT5KEhkhowQTHORpSkB54bLtGdIjE8C89asF7MmTtGqAG8779aC3r9Jjw2OZQOA42WecJOUNijPm1YFWAVxLVL+mZ0/Ixb4ZKtc0JWLZ2X45JPB4h+3D1EjFHKWMWfPfaHk3jyTPf6sMIZPuejatLNebQ== root@mode_11.cc

我们去 11 主机上连接目标主机,

[root@mode_11 ~]# ssh root@172.16.26.6

Last login: Sun Aug 24 16:33:53 2014 from 172.16.26.176   =>ok,不需要输入密码,就能认证通过了,

OK,前期准备工作都已完成,那么我们可以写脚本了

[root@mode_11 ~]# vim /usr/local/inotify/bin/inotify.sh  ==>编辑这个文件 内容如下

#!/bin/bash

src=/data

mb_ip=root@172.16.26.6:/data

/usr/local/inotify/bin/inotifywait -mrq -e modify,delete,create,attrib $src | while read file ;do =>当inotifywait 监测到目标目录有变化时,将执行while 循环中的语句

        /usr/bin/rsync -aqz -e ssh  ${src}/ ${mb_ip} && echo $file" send is ok"  ==>利用ssh 协议承载传输,同步本地源和目标机的数据

    #   /usr/bin/rsync -aqz -e ssh /data  root@172.16.26.6:/data

done

[root@mode_11 bin]# ./inotify.sh  运行该脚本

在172.16.26.11上的另一个终端窗口,创建一个 a.txt 文件

[root@mode_11 data]# touch a.txt

在脚本运行窗口查看

[root@mode_11 bin]# ./inotify.sh 

/data/ CREATE a.txt send is ok

/data/ ATTRIB a.txt send is ok   ==>监听端显示,发送已成功

[root@php5_6 data]# ll       ==>在目标主机上查看文件

total 0

-rw-r--r--. 1 root root 0 Aug 24 17:04 a.txt ==>已同步

这篇关于rsync的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128288

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景