使用rsync代替scp上传文件到服务器或从服务器下载文件(支持跨越跳板机)
Table of Contents
之前写过一篇使用scp实现类似功能的文章:
使用scp上传文件到服务器或从服务器下载文件(支持跨越跳板机)
还写过两篇rsync相关的文章:
使用sersync +rsync进行实时文件同步
CentOS7部署lsyncd+rsync实现服务器文件实时同步
什么是rsync?
运行man rsync
命令,可以看到它的解释是“rsync – faster, flexible replacement for rcp”,意思是“更加快速,灵活的rcp的代替”,意思是它比rcp更加快速,灵活,用于代替rcp。至于什么是rcp呢?rcp是remote copy,用于远程拷贝的命令,我也没有用过这个命令,看上去它应该是已经被rsync替代了。
据我实际使用所知,rsync是一个可以让你上传文件到服务器或从服务器下载文件的工具,它的优点是可以断点续传、增量同步(具有相同功能的scp就没有这两个功能),而且还安全(既可以通过ssh通道,也可以通过它自身的协议)。
实例演示
这里只说不需要搭建rsyncd服务器的方式,不搭建服务器的方式其实是通过ssh通道来传输的,所以下边的命令基本上都会弹出要你输入ssh的密码(除非你做了免密登录)。
需要搭建rsyncd服务器的同步方式可以看使用sersync +rsync进行实时文件同步这篇文章。
从本地拷贝到本地
rsync -P ./rsync1/test_from_rsync1 ./rsync2
当然本地到本地一般直接用cp命令就行,如果有增量同步的需求,也可以用rsync
另外如果有同步两个目录的需求也可以用rsync,以下命令会把./rsync1/
目录中的全部文件(包括里面的目录)同步到./rsync2/
目录中
rsync -rP --delete ./rsync1/ ./rsync2/
--delete
表示会把./rsync2/
中存在而./rsync1/
中不存在的文件删掉(以达到两个目录完全一样的目的)。
-r
表示recursive,递归操作,使用--delete
选项时必须使用-r
,否则报错,原因是使用--delete
后,源和目的必须都是目录(如果其中一个不是目录,虽然不报错,但是--delete
不会起作用),而如果两个都是目录,则必须用-r
,Linux中绝大部分命令在操作目录时,都使用-r
或-R
(表示递归执行操作)。
-P
表示同时启用--progress
+--partial
选项,--progress
表示显示传输进度,而--partial
表示不删除中断传输的文件(默认情况下如果有文件传输过程中断了,也就是只传了一部分,rsync会把已经传输的部分删除,相当于白传了,而加了--partial
选项后就不会删除,其实该选项就是开启断点续传
)。
本地拷贝到远程(上传文件到服务器)
把当前目录下的local_file.txt文件传到ip为12.32.56.78的服务器中
rsync -azP ./local_file.txt [email protected]:~
其中xiebruce是用来登录远程服务器的用户名,~
表示把文件传到xiebruce这个用户的家目录中,这是典型的ssh登录格式,因为它其它是通过ssh通道来传输的,所以如果你没有设置免密登录,它就会弹出让你输入密码的提示,你输入你的ssh登录密码即可。
-a
表示archive,打包/归档-z
表示compress,即压缩,再次说明,打包是打包,压缩是压缩,打包未必会压缩,但压缩一定会打包。-P
表示显示传输进程--progress
和断点续传--partial
,具体见从本地拷贝到本地。-u
不制覆盖远程服务器的文件(比如服务器上有一个aaa文件比你本地aaa文件还新,比如线上的aaa文件被你修改过,则用-u
选项后就不会用本地的覆盖线上的)。
与从本地拷贝到本地中说过的一样,如果你需要你本地的某个目录与远程服务器的某个目录数据完全同步,你需要添加--delete
选项以及-r
选项。
举例:把当前目录下的test目录与远程服务器xiebruce用户目录下的test目录数据完全同步
rsync -azrP ./test/ [email protected]:~/test/
同时传多个文件到服务器(空格隔开就行)
rsync -azP ./ccc ./ddd [email protected]:~/test/
如果服务器ssh端口不是默认端口,则要通过-e
选项来指定ssh端口ssh -p 2222
rsync -azP -e 'ssh -p 2222' ./ccc ./ddd [email protected]:~/test/
从远程拷贝到本地(从远程服务器下载文件)
就是把从本地拷贝到远程的源和目标两个参数反过来写就行。
从远程服务器下载/home/zhangsan/file1.txt
文件到本地当前目录./
rsync -azP [email protected]:/home/zhangsan/file1.txt ./
操作目录加-r
,完全同步两个目录加--delete
这我就不写示例了,跟前面的一样。
远程拷贝到远程(两个远程服务器之间拷贝)
没有直接的方法,貌似可以通过ssh -A,但我试了不行,这里有提到:How to rsync files between two remotes?。
所以这也是scp的优点之一,scp可以做到远程与远程之间拷贝:远程拷贝到远程(两个远程服务器之间拷贝)。
rsync跨越跳板机
通过跳板机把本地的test_from_rsync1
文件上传到远程服务器的~/rsynctest/
rsync -azP -e 'ssh -J [email protected]:22' ./rsync1/test_from_rsync1 [email protected]:~/rsynctest/
从远程服务器下载
rsync -azP -e 'ssh -J [email protected]:22' [email protected]:~/rsynctest/test_from_rsync1 ./rsync1/
与scp类似,都是通过ssh的代理来跨越的,与前面的命令不同的地方就是添加了以下这句,其中-J
就是--proxyJump
-e 'ssh -J [email protected]:22'
同理,这个选项也可以在ssh配置文件~/.ssh/config
中配置而不是直接写在命令里(太长太麻烦了)
# 定义跳板机
Host jump
HostName 11.22.33.44
User xiebruce
Port 22
# 定义目标机
Host 55.66.77.88
HostName 55.66.77.88
# 表示通过jump这个跳板机来传送
ProxyJump jump
在ssh配置文件中定义跳板机以及跳转的目标机后,前面那个命令就可以把-e
参数删掉,变成这样(简单多了)
# 上传
rsync -azP ./rsync1/test_from_rsync1 [email protected]:~/rsynctest/
# 下载
rsync -azP [email protected]:~/rsynctest/test_from_rsync1 ./rsync1/
免密码穿越跳板机
前面穿越跳板机可能要输入密码,要免密穿越跳板机,与ssh一样,只要满足“本地对跳板机ssh免密”及“本地对目标机ssh免密”,那么scp通过跳板机传送文件就能免密,而跳板机对目标机是不要求免密的。ssh免密配置方法请看:Linux-使用ssh免密码登录。
当然用expect应该也可以,但是需要自己编写命令,这个我也没有做过,就不在这里说了,Linux-使用ssh免密码登录有说到expect的。
rsync的选项很多,我只是说了几个我用到的,其它的可以自己man rsync
或rsync -h
查询。

