自接解Linux服务器后,rsync这个东西就一直若隐若现,但也没人要求帮安装配置什么的所以也就没有研究。
但近来要推弱口令改造,发现挺多就是rsync空口令,搞不懂这是什么东西就很不舒服,所以抽空来研究一下。
操作系统:CentOS 7
# 客户端和服务端程序都在rsync一个包里,客户机和服务机都装这个包就完事了
yum install rsync -y
下面介绍rsync的三种使用模式:本机内复制、机器间通过ssh复制、机器间通过daemon复制。
本机内复制,rsync就类似于cp命令,只是参数和cp有区别。
其实除了ssh还可以是rsh等,但一是不太熟二是这些东西终将被ssh取代就不管了。
机器间通过ssh复制,rsync就类似于scp命令,可从远程机复制到本机也可以从远程机复制到本机,只是参数和scp有区别。
由于传输借用的是ssh,所以一方面要明确这种模式是不需要启动rsync服务的,另一方面要明确其认证机制和两台机器间的ssh认证机器是一致的(即可以用密码也可用公钥免密等等)。
配置/etc/rsyncd.conf:
cat >> /etc/rsyncd.conf << EOF
# 没在模块名下的是全局配置。能在全局配置的项在模块中也都能配置,反之亦然,区别是模块配置的优先级高于全局配置。
# 增加名称为test的模块
[test]
# 模块根目录
path = /tmp/test
# 模块认证用户名。该用户只是rsync的和系统账号没关系。
# 如果没有下边这两个配置项,即为rsync空口令情况。两者必须同时存在,不然不起作用
# 如果要配置多个账号,则账号间用空格或逗号隔开
auth users = myuser
# 模块认证用户名对应密码。格式为明文"username:password",一行一个账号密码对
secrets file = /etc/rsyncd.passwd
# 模块ip白名单,白名单优先
# hosts allow = 192.168.220.129 192.168.220.130 192.168.221.0/24
# 模块ip黑名单
# hosts deny = 192.168.220.129 192.168.220.130 0.0.0.0/0
# 禁止自动列出所有模块
# list = no
EOF
配置/etc/rsyncd.passwd(其实文件名随意取决于你在/etc/rsyncd.conf中怎么配的。但格式则必须为"username:password"):
cat > /etc/rsyncd.passwd << EOF
myuser:mypass
EOF
另外密码文件只能配置成rsync运行用户有权限读,不然启动服务即便输的密码正确仍会报类似如下错误:
@ERROR: auth failed on module test
rsync error: error starting client-server protocol (code 5) at main.c(1649) [Receiver=3.1.2]
当然也可以直接在配置文件中匹置“strict modes = false”来处理,但并不建议这么做。我们配置为600权限:
chmod 600 /etc/rsyncd.passwd
启动rsyncd服务:
# 默认监听系统tcp 873端口
systemctl restart rsyncd
# 使用自定义端口启动
rsync --daemon --config=/etc/rsyncd.conf --port=22000
命令通过使用IP后接两个冒号(::)区分机器间通过ssh复制模式;两个冒号后接的是模块名(就直接模块名不要前面写/)。
假设场景是,A / B/ C三台机器,B上部署了rsync服务,我们只想让A单向上传文件到B(供C拉取),不想A能从B拉取文件,这个需求如何实现呢。
此时可以设置指向目录相同的两个模块,如叫A-B和B-C,A-B设置“write only =true”(另可搭配hosts allow和host deny)。
所谓匿名账号,就是没有用户名密码,本质就是没有设置我们上边说的“auth user”和“secrets file”。
此时不使用用户名密码即可上传下载文件:
# 列出所有模块,不使用账号能查看有哪些模块是rsync允许的,且当前看没法限制
rsync 192.168.220.129::
# 列出具体模块的文件。如果允许匿名账号,则目录被列出
rsync 192.168.220.129::test/
# 如果使用自定义端口。启动和连接都使用--port参数
rsync --port=22000 192.168.220.129::test/