使用rrsync限制rsync访问时出现目录不存在错误的问题咨询
问题描述
我最近尝试用rrsync脚本限制rsync的访问范围,在服务器的authorized_keys文件里配置了如下内容:
command="rrsync -ro /home/server_backup",restrict ssh-ed25519 AAA...
但当我在客户端执行这条rsync命令时:
rsync -e ssh -aivvv --human-readable server1:/home/server_backup/ /var/backup/server1
服务器端却返回了目录不存在的错误,从调试日志里能看到关键报错:
rsync: [sender] change_dir "/home/server_backup/home/server_backup" failed: No such file or directory (2)
我猜测是服务器上rrsync的参数和客户端rsync指定的源路径被合并到一起了,但实在搞不懂为什么会这样,也不知道该怎么解决这个问题,有没有大佬能帮忙解释下原因并给出解决方案呀?
原因分析
这其实是rrsync的核心工作逻辑导致的:当你在authorized_keys里用rrsync -ro /home/server_backup做限制时,/home/server_backup会被rrsync当作一个虚拟根目录。也就是说,客户端在指定rsync的源路径时,应该把这个限制目录当作"/"来使用,而不是再完整写出服务器上的真实路径。
举个直白的例子,你已经把服务器的访问范围锁死在/home/server_backup了,那客户端请求的源路径/home/server_backup/在rrsync看来,就是在虚拟根目录下再找/home/server_backup/,自然就拼接成了/home/server_backup/home/server_backup,这个嵌套目录肯定是不存在的,所以才会报错。
解决方案
解决起来很简单,只需要修改客户端的rsync命令,把源路径改成相对虚拟根目录的路径就行——这里直接用/就代表你在rrsync里指定的/home/server_backup目录:
rsync -e ssh -aivvv --human-readable server1:/ /var/backup/server1
如果之后你想验证rrsync的限制是否生效,还可以在服务器上手动模拟客户端的请求参数,比如执行:
rrsync -ro /home/server_backup --server --sender -vvvlogDtpre.iLsfxCIvu . /
这样就能提前看到路径处理的结果,避免再踩类似的坑。
备注:内容来源于stack exchange,提问作者janeden

