scp命令
scp命令功能就是,他能把自己当前主机的文件,通过远程给备份到另一台主机,从而实现远程备份这样一个基本的功能。
格式
我们来看一下这个scp命令的基本格式
scp [options] SRC... DEST/
用法
在看他的两种用法
scp [options] [user@]host:/sourcefile /destpath
scp [options] /sourcefile [user@]host:/destpath
常用选项
-C 压缩数据流
-r 递归复制 #拷贝文件夹必须要加 -r
-p 保持原文件的属性信息 #果你不保留属性,有可能权限就变了啊
-q 静默模式 #呢是静默,静默就是拷贝的时候有些信息就不显示了啊,把它隐藏起来,
-P PORT 指明remote host的监听的端口 #么P呢是表示端口。
#如果目标服务器的端口不是标准的22端口,你需要加上-P,进行指定
案例演示
SCP,进行拷贝的时候他有一些特点啊,我们来进行用案例来演示,看看这个scp命令的特点。
我们在我们源主机上也就是在Cents8上生成三个 100M大小的文件
生成之后我们来查看,这都是100M的文件,三个
现在我去拷贝data下的。这些文件因为考的是文件夹,所以-r。然后考到目标主机的比方说10.0.0.7 上去。
这个意思就是说,我自己的主机是Cenntos8,我把自己主机的/data/目录,给拷贝到了10.0.0.7 这个主机的/data/目录下了
如果你考的是这样做,你会发现他确实一个一个在拷贝,我把这个文件夹拷到下,但是问题是。
它拷贝的是这个data下的。内容呢?还是考文件夹本身呢?那我们来确认一下。
我们来切换到Centos7的主机上来,来看一下
我们来看他拷贝的是整个文件夹,也就是说把这个文件夹拷贝到的里面,成为他的子目录了。啊,是这种形式。
这个意思就是把自己Centos8主机下的这个data目录,复制给了 Centos7这个主机
我们在看一下目录结构
那如果你只是想考里面的文件,不想考里面的文件夹,那你就可以写星这样的话呢,我们就考的是文件,
下图这样的写法是,把文件里的内容给到10.0.0.7这个文件中 ,不加-r
那现在问题来了,我们现在在Centos8的上面,这个文件有的发生变化,比方说我们这儿。对f2这个文件发生了变化。
注意,只是对f2文件多加了一个换行符。
f1和f3没有变化。但是当我们进行复制的时候。我这儿写*。是否他还会重复的把没有改过的f1和f3重新复制呢?
那我们发现他发送的时候发送了所有的。f1,f2,f3,不论有没有变化,全都给你进行了复制,那这个地方呢?我们可以看到他的。数据报文增长了很多。原来是45万,现在变成了67万
scp的问题
那所以我们现在发现这个文件,只是改了一个文件,他也把所有文件全考了一遍,所以这个就感觉效率偏低。尤其将来我们公司里面用户呢,可能会开发一些新的软件版本出来。比方说有一个项目啊,电商项目,电商项目呢,它里面有涉及到很多相关的文件,比方说有很多的图片儿文件呀,
网页儿文件呀,这种文件特别多。当然,还有用户开发的程序,比方说还有什么JAVA包之类的jar包啊,或者war包之类的有很多。那么,作为一个网站来讲,它里面文件很多类型,但是软件网站改版了,比方说网站呢,更新了,换了个新版本。那软件版本更新了,但是并不意味着所有的文件都变了,
只是其中的一部分文件发生了变化啊,比方说公司里面的。有些程序发生变化,但是好多文件比方说一些图片啊,或者一些什么这个这个。网页文件呀,他并没有变化,那没有变化的话呢,如果你用SCP去实现网站的。内容的更新的话,那自然带来的缺点就是有没有变的,他就全给你考一遍,这样的话呢,效率太低。所以我们马上想到一个问题,
能不能实现一个所谓的基于增量性的更新呢?换句话说,就是只复制那些。发生变化的文件,如果没有变化的文件,我不想去更新它,我没有必要去更新它。那么,要想实现这功能, 我们可以采用另外一个工具,叫什么呢?
rsync它不管你的。他可以实现基于增量性的更新。
rsync命令
rsync工具可以基于ssh和rsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync包。
注意:通信两端主机都需要安装 rsync软件
用法
#下面两个命令只有斜线的区别不一样
rsync -av /etc server1:/tmp #复制目录和目录下文件
rsync -av /etc/ server1:/tmp #只复制目录下文件
常用选项
-n 模拟复制过程
-v 显示详细过程
-r 递归复制目录树
-p 保留权限
-t 保留修改时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-u 如果接收者的文件比发送者的文件较新,将忽略同步
-z 压缩,节约网络带宽
-a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
--delete 源数据删除,目标数据也自动同步删除
案例演示
我准备一个新文件夹。然后我把这些文件。移动到这个文件夹里去。好,现在文件夹是这样的一个状态啊
注意:通信两端主机都需要安装 rsync软件
有无斜线的区别
-a :表示保留他的属性 -v是查看过程
这个就是把Centos8主机的 /data/test/ 备份到 10.0.0.7 这个主机的/data 目录下
注意这个地方。这个文件夹里面包含了三个文件,然后我们目标写上10.0.0.7。
那也就是我们利用ssh的协议,把我当前主机上的test这个目录。拷贝到目标的/data下,
拷贝过去以后呢?现在我们就有一个问疑问,那么它考的时候他是把里面的文件拷过去了,还是把这个文件夹拷过去了呢?当然,文件夹拷过去,自然文件也拷过去了,对吧?那他拷的是文件还是拷的是文件夹呢?
我们来10.0.0.7的主机上看了一下,发现是文件,test文件夹本身没有拷贝过去
我们在换一种写法,就比刚才少了一个斜线
少了这个斜线,就能把整个test文件夹拷贝进去了
希望大家记住这个小细节。不加斜线,它考的是文件夹,本身加斜线,它只考里面的文件,而不考文件夹本身。
更新文件后拷贝
我们来继续试一下,文件更新之后,在进行rsync命令会怎么拷贝
我们在Centos8中更新f2文件
f1和f3没有发生变化
我们在使用rsync命令进行复制,看看能不能做到增量更新
我们先在Centos7上看网卡的传输,没复制前传输量是 1131882
我们来执行rsync 实现增量复制
根据下图,我们知道只有 f2文件发生了变化
我们在看网卡发送的包,只发送了100多个包
那么,没有变化的文件,他是不会复制的,所以这样的话呢,利用rsync是不是无形中效率就提高了?
节约了网络带宽。速度上也提高了,他只复制那些发生变化的文件。
当然,如果有一个问题,,就是我Centos7主机备份过去的文件发生了变化,我们对Centos7中的f3文件,做变化
注意我修改的是目标主机的文件
现在问题是我在Centos8上执行rsync命令的时候,会把Cetnos7上的 f3进行覆盖吗?
我们来执行一下
执行完我们来看Centos7上的f3的大小,与之前的f3大小进行对比,发现覆盖了这个f3文件
他这种比较呢?就是我不管你目标主机的文件是不是更新了,反正你和我源主机不一样了,我就把你覆盖了。
-u选项的理解
当然要想实现,刚才说我们就是只复制那些我变化的,但是呢,如果你比我新,我就不覆盖你了。唉,那这时候呢,也有方法,就是加上一个刚才说的u选项
我们来用案例演示
我在Centos8主机进行更新f1文件
对于f2和f3这两个文件来讲,我们在Centos8没有更新其中f3文件呢,跟目标服务器来比呢,f3。更旧一些
f3文件在Centos7上要更新一些,因为我被我更新过了,那这时候我再进行复制的时候,我们不仅希望。进行复制更新,
但是如果目标已经比我新了,我希望不要复制,不要把人家新的覆盖掉。那么这时候加个u就可以了。
我们看下图
我们加 -u 进行增量备份的时候,f3没有进行备份,只把f1进行备份了
-u
就是比较谁新谁旧,如果目标比我新,我就不覆盖对方了。
我们来验证刚才的结论,我们看Centos8主机文件的f3大小
f3的时间是 11:08
我们来看Centos7主机这个f3文件,它是没有被覆盖的
当然这里面还有一个问题,就如果目标主机也是就Centos7这里还有一些多余的数据呢?比方说有个f4文件。
就是在备份主机这里有一个f4文件,也就是这个Centos7主机上,它是目标主机,他比Centos8主机下的/data目录中多了一个f4文件
现在问题是,我在Centos8主机下执行rsync命令,会把Centos7主机里面的f4文件删除吗?
我们来看Centos7 ,发现没有删除
两台主机完全同步
所以换句话说,如果目标那边比我的文件要多,我是不会删他的。但是要想删也行,两边完全同步加什么?那我们来看加上。好加delete,
你看这是不是写了把f4给干掉了?为什么?你和我不一样。你比我多了,不行,我要把你删了,保证我们两边我有的你得有,
也就是保证,我们两台主机必须同步
总结
那这就是一个的一个小工具唉,大家想过没有用这个命令能做的什么事啊?这个事我们可以做什么事啊,将来我们能拿这个能干什么活啊?是不是将来我们生产中可以用它来实现备份呢?
比方说有一个服务器,上面有重要的数据。那这个数据呢?我们希望定期备份。那定期备份这个文件夹里的数据,我都想定期备份到一个远程服务器上去,我是不是就可以用这种方式了?我可以定一个计划任务,比方说每半天的时间或者每一天的时间,我都把他的数据利用这种方式给他复制到我的主机上去。复制到我的主机。来用这种方式来进行备份的功能,当然这个你需要配合计划任务啊,比方说你可以把这个命令写到一个。
计划任务里面。或者你把这个命令写在一个脚本里面,把这个脚本通过计划任务调用,每隔一段时间让它自动执行,这样的话呢,就可以实现。数据的自动备份明白了吧?而且呢,他备份的时候能确保两边始终保持一致。一致啊,当然你这跨网络通讯,如果觉得比较消耗资源的话,你可以加个z的话呢,他可以压缩。压缩的话,
-z的话可以压缩备份。可以节约带宽