两台Linux之间自动同步文件
背景
需求,服务器Linux A 更新SSL证书(Certbot renew)后,需要把证书自动同步到服务器Linux B
一、Linux B创建用户
创建用户
为Copy证书创建一个单独用户。利于权限控制
Markup 全选
# 添加用户 scpssl
useradd scpssl
# 设置用户scpssl密码
passwd scpssl
# 设置目录权限
setfacl -m u:scpssl:rwx /etc/nginx/ssl
# 设置子目录权限
setfacl -m d:u:scpssl:rwx /etc/nginx/ssl允许执行sudo nginx -s reload
用 visudo 编辑(必须这样)
Markup 全选
visudo不要用 vim 直接改 /etc/sudoers(容易写坏系统)
在文件最后加一行
Markup 全选
# 允许scpssl以root身份执行 nginx -s reload
scpssl ALL=(root) NOPASSWD: /usr/sbin/nginx -s reload
# 允许scpssl以root身份执行rsync
scpssl ALL=(root) NOPASSWD: /usr/sbin/rsync服务器上需要先确保安装了nginx以及rsync,如果没有安装就先安装,
查看路径:which rsync
安装路几个可能不同。所以这里要修改为自己的路径。如果路径不对,后面测试sudo操作会提示输入密码:
Markup 全选
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
sudo: 读取密码需要一个终端;请使用 -S 选项以从标准输入进行读取,或者配置一个 askpass 助手程序
sudo: 需要密码
保存退出,切换到scpssl,验证scpssl 执行权限
Markup 全选
# 切换到scpssl用户
su - scpssl
# 执行 ngxin reload
sudo nginx -s reload
二、Linux A生成证书
因为我们要自动同步,所以需要服务器A利用SSH密钥来登录到服务器B。
服务器A中执行命令生成SSH证书,
注意切换到/root/.ssh目录中运行,这样生成的文件会在.ssh目录里中
Markup 全选
ssh-keygen -t rsa
三、Linux A中导入SSH证书到Linux B
copy证书到服务器B,不需要copy文件,使用ssh-copy-id命令就行
Markup 全选
ssh-copy-id scpssl@10.8.0.3测试登录
Markup 全选
# 因为证书名字不是默认id_rsa名称,因此这里需要指定证书名字
ssh -i /root/.ssh/id_rsa_scpssl scpssl@10.8.0.3
四、Linux A创建同步脚本
新建文件
Markup 全选
vim /usr/local/bin/sync-cert.sh内容如下:
Markup 全选
#!/bin/bash
SRC="/etc/letsencrypt/live/"
DEST="scpssl@10.8.0.3:/etc/nginx/ssl/"
# rsync -avz --delete $SRC $DEST
rsync -avzL -e "ssh -i /root/.ssh/id_rsa_scpssl " $SRC $DEST --rsync-path="sudo rsync"
# 可选:重载目标服务器 nginx
# ssh -i /root/.ssh/id_rsa_scpssl scpssl@10.8.0.3 "sudo nginx -s reload"
if [ $? -eq 0 ]; then
ssh -i /root/.ssh/id_rsa_scpssl scpssl@10.8.0.3 "sudo nginx -s reload"
fi添加执行权限
Markup 全选
chmod +x /usr/local/bin/sync-cert.sh测试执行:
Markup 全选
rsync -avz -e "ssh -i /root/.ssh/id_rsa_scpssl " /etc/letsencrypt/live/ scpssl@10.8.0.3:/etc/nginx/ssl/ --rsync-path="sudo rsync"Markup 全选
# 测试rsync
rsync -avz -e "ssh -i /root/.ssh/id_rsa_scpssl " /etc/letsencrypt/live/ scpssl@10.8.0.3:/etc/nginx/ssl/ --rsync-path="sudo rsync"
# 测试整个脚本执行
/usr/local/bin/sync-cert.sh
五、绑定到certbot自动执行(重点)
certbot 有专门的 hook:--deploy-hook
执行
Markup 全选
certbot renew --deploy-hook "/usr/local/bin/sync-cert.sh"
或者写入配置(推荐)
Markup 全选
vim /etc/letsencrypt/renewal-hooks/deploy/sync-certs.sh内容:
Markup 全选
#!/bin/bash
/usr/local/bin/sync-cert.sh执行权限
Markup 全选
chmod +x /etc/letsencrypt/renewal-hooks/deploy/sync-cert.sh
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
post 张国生


