rsync通过SSH同步,多种配置笔记

原创
2020/12/05 09:47
阅读数 1.1K

2020年12月05日:研究 rsync通过ssh同步,总结出 5种配置

总结

ssh 可用 path 和 module 两种方式。后者可以用配置文件rsyncd.conf 控制。加上root和非root 共五种组合
使用root帐号会比较简单,没权限问题,但是安全性差些。使用非root安全性好些,但会让配置变复杂
  • 方案1:使用root + path。不需要太多额外操作
  • 方案2(推荐):使用非root(www)+ path方式。不需要额外操作,注意文件权限 - 简单,安全性中
  •  
  • 方案3:使用root+module。需要配置rsyncd.conf,下同
  • 方案4(推荐):使用www+module + sudo,额外需要配置sudo - 中等复杂,安全性好
  • 方案5:使用www+module + 独立配置rsyncd_www.conf,不使用sudo,注意权限问题
  •  
  • ssh 参数信息 可以写到配置文件 ~/ssh/config
  • ssh不是22端口,可以加 -p 参数,比如 -p 2222
  • 最简单的方式是 root/www + path,不用额外配置rsyncd.conf
  • 推荐 使用 www用户 + sudo + rsyncd.conf ,安全性好、功能更丰富(过滤,控制访问IP,添加user/pass验证等功能)
  • 注意目录、文件权限:chown -R www:www /data/www

准备工作:

1. 如果使用非root方案,需要在远程服务器创建用户(细节略过)。本文的非root用户 和 www用户 是一个意思

2. 生成ssh key,并部署到 远程服务器,注意文件路径、权限(细节略过)

ssh-keygen -b 2048
生成文件在 /var/lib/jenkins/.ssh/id_rsa

公钥写入远程服务器(根据方案选择一个)
/root/.ssh/authorized_keys (root)
/home/www/.ssh/authorized_keys (www)

环境说明

源目录是 src,目标目录是 /data/www,

rsyncd.conf 配置 www_data 模块,路径是/data/www,

本机IP是1.2.3.3 远程是1.2.3.4

本地用户是jenkins,远程是 root/www

rsync 的参数很多,略过和本文不相关的参数,只使用 -a

 

rsync命令格式

Access via remote shell:
rsync [OPTION...] SRC... [USER@]HOST:DEST

Access via rsync daemon:
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

SRC:源文件或目录
DEST:目标文件或目录
USER@:目标用户,不加默认为root。
HOST:远程主机IP

 

方案1:用root帐号 + path方式

rsync -e 'ssh -l root -i /var/lib/jenkins/.ssh/id_rsa -p 22' -a src  1.2.3.4:/data/www/
 
-e 指定 ssh的参数:-l 指定 ssh的用户,此处是root,其他方案会用www。-i 是指定私钥文件路径,-p 指定ssh端口
可以把-i -p 参数 写入配置 ~/.ssh/config,-l参数默认是当前用户,不一致需要指定。(备注:命令实际执行是 jenkins用户)
Host 1.2.3.4
  User root
  PreferredAuthentications publickey,password
  IdentityFile ~/.ssh/id_rsa
简写成:rsync -e 'ssh -l root' -a src  1.2.3.4:/data/www/
 
可以把user参数写到后面,同时省略-e选项:
rsync -a src  root@1.2.3.4:/data/www/

注意:rsync -e "ssh -l user1" ... user2@ip:/path/
user参数的优先级是 user2 > user1 > config的配置

方案2:用www帐号 + path方式

rsync -e 'ssh -l www '   -a src  1.2.3.4:/data/www/
和方案1类似 -l 改成了www,需要注意 远程目录是否有权限写入

 

方案3:用root帐号 + module方式

rsync -e 'ssh -l root' -a src  rsync_user @1.2.3.4::www_data/
 
配置rsyncd.conf
use chroot = yes
pid file = /data/log/rsyncd.pid
lock file = /data/log/rsync.lock
log file = /data/log/rsyncd.log
write only = true
read only = false
#port = 8730

[www_data]
uid=root
gid=root
path = /data/www/
#auth users = rsync_user
#secrets file = /etc/rsyncd.pas
#hosts allow = 1.2.3.3,127.0.0.1,0.0.0.0
#hosts deny = 0.0.0.0/0
#exclude from = /etc/rsyncd_filter
配置好后,不用手动启动 rsync daemon。执行命令的时候会 通过ssh启动。
这种方式会导致 一些奇怪的问题,尤其是非root用户,不好排查。非root用户建议用 sudo方案。
 
注意:后面的rsync_user 指的rsyncd.conf中的配置,不再是系统用户。
如果不开启auth users,会忽略,开启则有两种验证,不要混淆。如果想进一步加强安全性,可考虑开启。
 
注意 hosts allow 添加了 0.0.0.0,不添加会报错
rsync denied on module www_data from UNKNOWN (0.0.0.0)
 

方案4:用www帐号 + module + sudo 方式

rsync --rsync-path="sudo rsync" -e 'ssh -l www' -a src  1.2.3.4::www_data/

rsyncd.conf 使用方案3,需要额外配置sudo,让www 用root权限 启动 远程的/usr/bin/rsync

visudo:

www ALL=(root) NOPASSWD: /usr/bin/rsync
Defaults:www !requiretty

方案5:用www帐号 module + 独立rsyncd.conf 配置 方式 (出问题处理麻烦)

rsync  --rsync-path="rsync --config=/etc/rsyncd_www.conf " -e 'ssh -l  www' -a src  1.2.3.4::www_data/
 
注意选项 --rsync-path="rsync  --config=/etc/rsyncd_www.conf "
因为www用户权限不足,很多配置和root的配置不一样,所以www用户使用自己的配置文件。
 
use chroot = no
pid file = /data/log/rsyncd_www.pid
lock file = /data/log/rsync_www.lock
log file = /data/log/rsyncd_www.log
write only = true
read only = false
#port = 8730

[www_data]
path = /data/www/
#auth users = www
#secrets file = /etc/rsyncd.pas
hosts allow = 1.2.3.3,127.0.0.1,0.0.0.0
hosts deny = 0.0.0.0/0
exclude from = /etc/rsyncd_filter
主要差别是:
use chroot = no
uid/gid 不能用
 
如果配置不正确,会报错:
rsync: did not see server greeting
 

 

 
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部