expect实现rsync免密码传输

问题背景:

    生产服务器A,灾备服务器B,由于生产环境更新频繁,要保持灾备环境和生产环境的数据一致性,所以用脚本形式定时同步生产A的内容到灾备B。


实现方式:

1、expect脚本实现单个目录免密码传输,DataGuard_expect.exp

#!/usr/bin/expect


#定义变量
#srcdir 源路径 
#ip 目标IP
#desdir 目标路径
set srcdir [lindex $argv 0]
set ip [lindex $argv 1]
set desdir [lindex $argv 2]

#设置超时时间3000s
set timeout 3000

send_user "start to rsync!!\n\r"

spawn rsync -rqtz --delete $srcdir username@$ip:$desdir

expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "password\r";exp_continue}
}

send_user "rsync successfully!!!\n"


2、将源端目录、目的端灾备B的IP、目的端目录写在文件中,遍历该文件,循环调用expect脚本

 DataGuard_job_sync.sh  脚本内容:

#!/bin/sh
###rsync 同步脚本
###实现生产环境向灾备环境同步jar包,配置文件不同步

#前端文件
cat /home/username/DataGuard_sync/job_lib_file.txt | while read line
do
    echo $line > /home/username/DataGuard_sync/VM_tmp.txt
    I=`awk -F " " '{print $1}' /home/username/DataGuard_sync/VM_tmp.txt`
    J=`awk -F " " '{print $2}' /home/username/DataGuard_sync/VM_tmp.txt`
    K=`awk -F " " '{print $3}' /home/username/DataGuard_sync/VM_tmp.txt`
    expect /home/username/DataGuard_sync/DataGuard_expect.exp $I $J $K
done


源端目录、目的端灾备B的IP、目的端目录 对应关系文件:

job_lib_file.txt

/home/dir1/pay1paylib/ 10.x.x.xx /home/dir1/pay1paylib/

/home/dir2/lib/ 10.x.x.x /home/dir2/lib/


3、脚本运行说明

a.将DataGuard_expect.exp、DataGuard_job_sync.sh、job_lib_file.txt 放在源端服务器A的任意目录下

b.更改job_lib_file.txt内容为实际对应关系,修改 DataGuard_job_sync.sh中的文件目录为放置脚本的目录

c.执行sh  DataGuard_job_sync.sh 等待脚本执行完毕后,检查下目的端对应目录下文件有没有更新。

d.若需要定时自动同步,则在crontab里面配置定时任务即可。

0 1 * * 5 su - username /home/username/DataGuard_job_sync.sh     ####以username用户,每周五凌晨一点执行同步脚本

你可能感兴趣的:(运维,脚本)