GO
1. scp工具
scp用来拷贝用的,可远程和本地相互之间都可以,与rsync差不多,但是它不支持增量备份。
用法如下:
scp
是由openssh-clients
包支持的,安装这个包就可以使用scp了,但是远程备份的时候双方都必须安装这个包。scp -r a/ 192.168.1.12:/tmp/b/
把a目录拷贝到IP的/tmp/下更名为b,IP前不加用户名默认使用当前用户。scp -r a/ root@192.168.1.12"/tmp/a/"
从本地拷贝到远程scp -r 192.168.1.12:/tmp/a/ ./a/
从远程拷贝到本地
2. rsync工具
2.1. 介绍
在Linux 系统下的数据备份的工具有很多,但其实只用一种就可以满足所有的备份工作,那就是rsync这个工具。从字面上的意思可以理解为remote sync(远程同步)
,这样可以理解的更深刻一些。
rsync工具不仅可以远程同步数据(类似于scp),当然还可以本地同步数据(类似于cp)。但不同于两者的是,rsync工具不会覆盖以前的数据(如果数据已经存在),它会先判断已经存在的数据和新数据有什么不同,只有不同时才会把不同的部分覆盖掉。远程备份和增量备份是它的优势。
如果Linux系统中没有这个工具,请先安装它:yum install -y rsync
。
2.2. 使用
使用格式:
rsync [选项] 源 目标
——————–//本地同步文件rsync [选项] 源 userbname@ip:目标
——-//从本地上传到远程去rsync [选项] username@ip:源文件 目标
—-//从远程下载到本地来rsync [选项] 源 username@ip::模块名
rsync [选项] username@ip::模块名 目标
后两种的两种格式中使用了两个冒号,这种方式和前面的方式的不同在于验证方式的不同。后面会再详细介绍。
常用选项:
- (常用)
-a
归档模式,表示以递归方式传输文件,并保持所有属性。相当于选项-rlptgoD
。这个选项后面可以跟一个--no-OPTION
这个表示关闭-rlptgoD
中的某一个,例如-a --no-l
在a选项中去除l选项 - (常用)
-v
显示信息,显示文件拷贝的速率、文件数量等状态信息 - (常用)
-z
压缩传输 - (常用)
--delete
删除那些DST中SRC没有的文件 - (常用)
--exclude=PATTERN
指定排除不需要传输的文件,等号后面跟文件名,支持通配符(如*.txt) - (常用)
--password-file=filename
指定密码文件 - (常用)
rsync --daemon
后台模式启动rsync --daemon --help
可查看帮助文件rsync --daemon --config=/etc/rsyncd.conf
指定配置文件,默认使用/etc/rsyncd.conf配置文件
-r
针对目录,对子目录以递归模式处理-l
针对软链接文件来使用,保持软链接文件的本身类型-L
像对待常规文件一样处理软链接,如果SRC中有软链接文件,则把软链接所指向的源文件拷贝-u
加上这个选项后将会把DST中比SRC还新的文件排除掉,不会覆盖-p
保留权限-t
保留时间属性-g
保留所属组信息-o
保留所属主信息-D
保持设备文件信息(只针对超级用户使用,目前还不理解)-P或--progress
在同步的过程中可以看到同步的过程状态,比如统计要同步的文件数量、同步的文件传输速度等等。--bwlimit=100
限速,最大传输速度为100kb
2.3. 一些重要的实验
- 建立目录以及文件
mkdir rsync
cd rsync
mkdir test1
cd test1
touch 1 2 3 /root/123.txt
ln -s /root/123.txt ./123.txt
ls -l
- 建立这些文件的目的就是为了做实验做一些准备工作。
- 使用
-a
选项rsync -a test1 test2
ls test2
ls test2/test1/
- 这里有一个问题,就是本想把test1目录直接拷贝成test2目录,可结果rsync却新建了test2目录然后把test1放到了test2当中。为了避免这样的情况发生,可以这样做:
rm -rf test2
rsync -a test1/ test2/
ls -l test2/
- 加一个斜杠就好了,所以我建议你在使用rsync备份目录时要养成加斜杠的习惯。
- 在上面讲了-a选项等同于-rlptgoD,而且-a还可以和–no-OPRIN一并使用。
- 下面来看看
-l
选项的作用rsync -av --no-l test1/ test2/
- 使用-v选项看来就是很方便,上例告诉我们跳过了非普通文件123.txt,其实123.txt是一个软链接文件,如果不使用-l选项则不理会软链接文件。
- 虽然加上-l选项会把软链接文件给拷贝过去,但是软链接的目标文件却没有拷贝过去,有时候咱们指向拷贝软链接文件所指向的目标文件,那这时候该怎么办呢?
- 使用
-L
选项rsync -avL test1/ test2/
ls -l test2/
- 加上-L选项就可以把SRC中软链接的目标文件给拷贝到DST。
- 使用
-u
选- 首先查看一下test/1和test2/1的创建时间(肯定是一样的),然后使用touch修改一下test2/1的创建时间(此时test2/1要比/test1/1的创建时间晚了一些)。如果不加-u选项的花,会把test2/1的创建时间变成和test1/1的创建时间一样。这样讲也许会让人迷糊,不妨看一看:
ll test1/1 test2/1
两者之间的创建时间是一样的,下面修改test2/1的创建时间,然后不加-u同步touch test2/1
ll test2/1
rsync -av test1/ test2/
ll test2/1
- test2/1的创建时间又变成和test1/1的创建时间一样了。下面加上-u选项再看看结果是怎样的
touch test2/1
ll test2/1
rsync -avu test1/ test2/
ll test1/1 test2/1
- 加上-u选项后,不会再把test1/1同步为test2/1了,这就是-u选项的妙用。
- 使用
--delete
选项- 首先删除test1/123.txt
rm -rf test1/123.txt
- `ls test1/
- 然后把test1/目录同步到test2/目录下
rsync -av test1/ test2/
ls test2/
- test2/目录下并没有删除掉123.txt,下面加上–delete选项
rsync -av --delete test1/ test2/
ls test2/
- test2/目录下的123.txt也被删除了,这就是–delete选项的用处。
- 还有一种情况就是如果在DST增加文件,而SRC当中没有这些文件,同步时加上–delete选项后同样会删除新增的文件。
touch test2/4
ls test1/ test2/
rsync -a --delete test1/ test2/
ls test1/ test2/
- 首先删除test1/123.txt
- 使用–exclude选项
touch test1/4
rsync -a --exclude="4" test1/ test2/
ls test1/ test2/
- 另外还可以使用匹配字符*
touch test1/1.txt test1/2.txt
ls test1/ test2/
rsync -a --progress --exclude="\*.txt" test1/ test2/
ls test2/
- 上例中,连带着使用了–progress选项,这个主要是用来观察rsync同步过程的状态的。
- 最后简单总结一下,在平时使用rsync同步数据的时候,使用-a选项基本上就可以达到我们想要的效果了,只是有时候有个别的需求,会用到-a -no-OPTION、-u、-L、–delete、–exclude以及–progress这些选项,还有些选项虽然没有介绍,但是在以后的工作中遇到特殊需求了,就去查一下rsync的man文档吧。
2.4. rsync应用实例:通过ssh隧道的方式(干货)
在之前介绍的5种方式当中,第二、第三(一个冒号)就属于通过ssh的方式,这种方式其实就是让用户去登陆到远程机器,然后执行rsync的任务。这就需要准备两台Linux机器,因为用到了ssh,所以必须要安装openssh-clients
包才可以,两台机器都安装一下:yum install -y openssh-clients
。
rsync -avL test1/ www@192.168.0.101:/tmp/test2/
- 这种方式就是前面介绍的第二种方式了,是通过ssh拷贝的数据,需要输入192.168.0.101那台机器WWW账户的密码。
rsync -avL www@192.168.0.101:/tmp/test2/ ./test3/
- 这种方式就是第三种拷贝的方式了。
如果ssh服务的默认端口该成别的了,那么如何给rsync指定ssh的端口呢?用这个方式:rsync -avPL -e "ssh -p 端口" 源 目的
以上两种方式如果写到脚本里,备份起来就有麻烦看了,因为要输入密码,脚本本来就是自动的,不可能做到。但是不代表没有解决办法,那就是通过密钥验证,密钥不设立密码就ok了。方法如下:
- 在操作之前我们先讲明主机信息:192.168.0.10(主机名Aming-1)和192.168.0.101(主机名Aming),需要从Aming-1上拷贝数据到Aming上。首先确认一下Aming-1上是否有这个文件/root/.ssh/id_rsa.pub
- 如果没有这个文件,按照下面的方法生成:
ssh-keygen
- 在这个过程中会有一些交互的过程,它首先提示要输入这个密钥的密码,出于安全考虑应该定义个没密码,但是我们的目的就是为了自动化同步数据,所以这里不输入任何密码,直接回车,即密码为空。最后则生成了私钥(/root/.ssh/id_rsa)和公钥(/root/.ssh/id_rsa.pub)。
- 把公钥文件的内容拷贝到目标机器上:
cat .ssh/id_rsa.pub
,复制内容 - 复制主机Aming-1的/root/.ssh/id_rsa.pub文件内容,并粘贴到主机Aming的/home/www/.ssh/authorized_keys中:
vi /home/www/.ssh/authorized_keys
- 在这一步也许您会遇到/home/www/.ssh目录不存在的问题,可以手动创建,并修改目录权限为600,也可以执行
ssh-keygen
命令生成这个目录。
- 保存/home/.ssh/authorized_keys文件后,再到主机Aming-1上执行:
ssh www@192.168.0.101
- 现在不用输入密码也可以登陆主机Aming了。
- 下面先从Aming主机退出来,再从主机Aming-1上执行一下rsync命令试试吧:
rsync -av rsync/test1/ www@192.168.0.101:/tmp/test4/
2.5. rsync应用实例:通过后台服务的方式(干货)
这种方式可以理解成这样,在远程主机上建立一个rsync的服务器,在服务器上配置好rsync的各种应用,然后本机作为rsync的一个客户端去连接远程的rsync服务器。
如何去配置一台rsync服务器呢?如下所示:
建立并配置rsync的配置文件
/etc/rsyncd.conf
vi /etc/rsyncd.conf
加入如下内容:123456789101112131415#port=873log file=/var/log/rsync.logpid file=/var/run/rsyncd.pid#address=192.168.0.10[test]path=/root/rsyncuse chroot=truemax connections=4read only=nolist=trueuid=rootgid=rootauth users=testsecrets file=/etc/rsyncd.passwdhosts allow=192.168.0.101其中的配置文件分为两部分:全局配置部分和模块配置部分。全局部分就是几个参数而已,就像上例中的port、log file、pid file、address这些都属于全局配置,而[test]以下的部分就是模块配置部分了。
- 一个配置文件中可以有多个模块,模块名自定义,格式就像上例中的这样。其实模块中的一些参数例如use chroot、max connections、uid、gid、auth users、secrets file以及hosts allow都可以配置成全局的参数。当然上例所给出的参数并不是全部的,你可以通过man rsyncd.cong获得更多帮助信息。
- 下面简单解释一下这些参数的意义:
port
指定在哪个端口启动rsync服务,默认是873端口log file
指定日志文件pid file
指定pid文件,这个文件的作用涉及到服务的启动以及停止等进程管理操作address
指定启动rsyncd服务的IP,假如你的机器有多个IP,就可以指定其中一个启动rsyncd服务,默认是在全部IP上启动[test]
指定模块名,自定义path
指定数据存放的路径use chroot true|false
默认是true,意思是在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以root权限,并且不能备份指向外部的符号链接所指向的目录文件。默认情况下chroot值为true,如果你的数据当中有软链接文件的话建议设置成falsemax connections
指定最大的连接数,默认是0,即没有限制read only true|false
如果为true则不能上传到该模块指定的路径下list
指定当用户查询该服务器上的可用模块时,该模块是否被列出,设定true列出,false隐藏uid和gid
指定传输文件时,以哪个用户和组的身份传输auth users
至i的嗯传输时要使用的用户名secrets file
指定密码文件,该参数连同上面的参数如果不指定则不使用密码验证,注意该密码文件的权限一定要是600hosts allow
指定被允许连接该模块的主机,可以是IP或者网段,如果是多个,之间用空格隔开
- 编辑secrets file,保存后修改权限为600,如果权限不对,不能完成同步
cat /etc/rsyncd.passwd
chmod 600 /etc/rsyncd.passwd
- 启动rsyncd服务
rsync --daemon --config=/etc/rsyncd.conf
- 启动后,可以查看一下日志,并查看端口是否启动:
cat /var/log/rsync.log
netstat -lnp | grep 873
- 如果想开机启动,请把命令
rsync --daemon --config=/etc/rsyncd.conf
写入到/etc/rc.d/rc.local
文件 - 到另一台机器上测试:
rsync -avL test@192.168.0.10::test/test1/ /tmp/test5/
- 有一个选项叫做”use chroot”默认为
true
,如果是true
,同步的文件中如果有软链接,则会有问题,而把主机Aming-1的rsync配置文件修改一下,把该配置语句的值设置为false
,这样就没有任何问题了。 另外,修改玩rsyncd.conf配置文件后不需要重启rsyncd服务,这是rsync的一个特定机制,配置文件是即时生效的。
可以通过这个命令列出来服务端可使用的rsync的模块:
rsync IP::
2.6. 最后的说明
上面的那个例子中,都有输入密码,这样同样也不能写入到脚本中自动执行,其实这种方式也是可以不用手动输入密码的,它有两种实现方式:
- 指定密码文件
- 在客户端上,也就是主机Aming上,编辑一个密码文件:
vim /etc/pass
,在其中加入test用户的密码,保存,修改密码文件的权限为600 - 在同步的时候,指定一下密码文件,就可以省去输入密码的步骤了
rsync -avL test@192.168.0.10::test/test1/ /tmp/test8/ --password-file=/etc/pass
- 在客户端上,也就是主机Aming上,编辑一个密码文件:
- 在rsync服务端不指定用户
- 在服务端上,也就是主机Aming-1上,修改配置文件rsyncd.conf,删除关于认证账户的配置项(auth user和secrets file这两行),如下:
sed -i 's/auth users/#auth users/;s/secrets file/#secrets file/' /etc/rsyncd.conf
- 上面这条操作就是在文件/etc/rsyncd中把auth users和secrets file这两行的最前面加一个#号,这表示将这两行作为注释,使其失去意义。
然后在到客户端上,也就是Aming上进行测试,如下: rsync -avL test@192.168.0.10::test/test1/ /tmp/test9/
- 注意这里不用再加test这个用户了,默认是以root身份复制的。现在登陆时已经不需要输入密码了。
- 在服务端上,也就是主机Aming-1上,修改配置文件rsyncd.conf,删除关于认证账户的配置项(auth user和secrets file这两行),如下:
3. rsync扩展知识
3.1. rsync只同步指定类型的文件
需求:同步某个目录下所有的图片(.jpg),该目录下有很多其它类型的文件,但是只想同步.jpg文件。
rsync有一个–exclude可以排除指定文件,还有个–include选项的作用正好和–exclude相反。那直接使用–include=”*.jpg”是否可以呢?
rsync -av --include="\*.jpg" /src/ /des/
实验证明,这样是不对的。而正确答案是:rsync -av --include=".jpg" --exclude= /src/ /des/
3.2. rsync如何在远程自动创建目录
默认情况下,使用rsync的时候,不能自动创建级联目录。比如rsync -a /data/1/2/3/1.txt 1.1.1.1.:/date/1/2/3/1.txt
这样会报错的。
所以改一改上面的命令:rsync -a /data/1/2/3/1.txt 1.1.1.1:/data/
这样同样也达不到我们想要的效果,这样虽然不再报错,但是这样只是把1.txt放到了1.1.1.1:/data/目录下。
rsync有个选项那就是-R,这个选项会帮助我们自动创建级联目录。所以,上边的命令应该改成这样:rsync -aR /data/1/2/3/1.txt 1.1.1.1:/data/
这样就会在1.1.1.1:/data/目录下创建1/2/3/这样的级联目录,类似mkdir -p
3.3. rsync根据一个文件列表文档来同步
有时候,有这样的需求,就是根据一个文档中的文件列表来同步文件。举一个例子,1.txt是文件列表,内容如下:
那么同步的命令应该是:rsync -av --files-from=1.txt / ip::module/
需要注意的是,1.txt中如果写全局路径,那么source目录需要写成/
OK