日常工作和学习中我们经常需要将本地的文件同步到远程 Linu
服务器中,或者要实现本地和服务器的文件同步。FTP
文件传输协议是大家都熟知的实现方案,今天给大家介绍一个很好用的工具 rsync
。
rsync
rsync
是 remote sync
的含义,表示远程同步,当时我们也可以同步两个本地的文件夹,此时命令的效果类型 cp
命令。
不过与其他文件传输工具(如 FTP
或 scp
)不同,rsync
的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。
这个特性对于我们经常写博客的朋友也很有帮助,因为我们经常会需要将博客进行备份。
安装
根据系统类型的不同,安装的命令也不相同
# Debian
$ sudo apt-get install rsync
# Red Hat
$ sudo yum install rsync
# Arch Linux
$ sudo pacman -S rsync
# macOS
brew install rsync
了不起这边是 macOS
系统,就直接选择最后一种方式进行安装了,当然远程的服务器也需要进行安装。
基操
本地同步
本地使用 rsync
的命令为 rsync -r source destination
,表示将 source
位置的文件夹里面的内容全部同步到 destination
文件夹里面,同时也支持多个 source
位置,命令是这样的 rsync -r source1 source2 destination
。
其中需要注意的是 -r
表示递归,即包含子目录,而且是必须的,否则 rsync
运行不会成功。
执行命令 rsync -r source1 source2 ./destination
效果如下,会将 source1
和 source2
两个文件夹都同步到 destination
文件夹下面,如果只同步文件则可以使用 rsync -r source1/ source2/ ./destination
则只会同步文件到目标文件夹。
虽然说上面的命令可以正常的使用,但是在真正使用命令的时候,我们会将上面命令中的 -r
参数替换成 -a
参数,因为 -a
参数不但可以递归同步同时也可以同步文件的元数据,比如创建时间,修改时间这些,所以 -a
比 -r
参数更加实用。
同时为了让我们知道哪些文件被真正的同步了,我们还会实用 -v
参数,-v
参数会将真正同步了的文件在终端中输出出来,方便我们知晓,所以往往本地最终执行的命令是这样的。
rsync -av source destination
远程同步
上面的命令是在本地执行,如果想要将本地的文件同步到远程服务器,那我们就需要结合 SSH
协议来实现了,整体的命令是这样的
rsync -av source root@xxx.xxx.xxx.xxx:/destination
输入命令过后,在输入一下对应的 root
账号密码即可。
如果我们的 SSH
的端口不是默认的22
端口,则需要使用 -e
参数来设置端口,命令如下
rsync -av -e 'ssh -p 22222' source root@xxx.xxx.xxx.xxx:/destination
可以看到服务器上面已经同步了对应的文件了
免密登录
正常在使用上面远程同步命令的时候,都需要我们再次手动输入服务器账号对应的密码,我们都知道 SSH
是可以免密登录的,我们只需要生成一个公钥和私钥,然后将公钥发送到服务器上面,发送的时候输入一次密码,以后在执行远程同步命令的时候就可以免密登录不用输入密码了。
先生成公钥和秘钥
ssh-keygen
根据提示一步一步回车就行,最终会在 .ss
h 目录中生成id_rsa
和 id_rsa.hub
两个文件,然后我们在通过下面的命令将公钥发送到远程服务器上面。
ssh-copy-id -i ./id_rsa.pub -p 22 root@xxx.xxx.xxx.xxx
发送的时候会要求输入一次密码,成功以后我们再执行同步命令,就不会再需要密码了。
扩展思考
至此我们已经实现了本地和远程服务器的文件同步功能,那么我们完全可以再更进一步,在本地搞个定时器,定期的自动执行同步功能,而不是每次我们都手动同步,这个就交给大家自己去实践了,感兴趣的可以去研究一下。
总结
参考文章:https://www.ruanyifeng.com/blog/2020/08/rsync.html