expect交互命令与rsync文件同步

介绍

expect命令是一个自动化工具,可以根据脚本与其他交互式程序进行交互,通过在脚本中设定期望值和响应值进行交互操作,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

expect中,有三个重要的主命令,分别是spawn、expect、exp_send,这三个命令几乎存在于所有expect脚本中,除了这些之外,还有很多expect所特有的参数、变量,它们也作用于expect的方方面面。

spawn激活,send发送到交互命令。

图片[1]-expect交互命令与rsync文件同步-不念博客

rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。

rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。

说明

本文脚本主要是通过调用实现文件批量自动与多台服务器进行交互更新。

文件列表:

  • auto_expect:expect命令的执行模板。
  • ip_list_config:存放IP和密码的配置文件,IP在前,与密码之间用空格或tab隔开。
  • sync_file.sh:待执行脚本

auto_expect

#!/usr/bin/expect -f
spawn rsync -avzP source root@$ip:dest
expect {
    "(yes/no)?" {send "yes\r";exp_continue}
    "password:" {send  "$pwd\r"}
}
expect eof

ip_list_config

192.168.0.1 passwd1
192.168.0.2 passwd1
192.168.0.3 passwd1

sync_file.sh

#!/usr/bin/expect -f   
################define variables###############
path=`pwd` 
################begin of main #################      
 
show_usage()   
{   
        echo "USAGE:$0"   
        echo "          [-s | -source]"   
        echo "          [-d | -des   ]"   
        echo "          [-h | -help  ]"   
}   
   
auto_rsync()   
{   
        while read iplist   
        do   
                ip=`echo $iplist | awk '{print $1}'`   
                pwd=`echo $iplist | awk '{print $2}'`   
                echo -e "$iplist\n"   
                echo "rsync -avzp $source_file root@$ip:$des_file"   
                sed -e "s;source;$source_file;g" auto_expect>auto_expect_rsync   
                sed -i "s;dest;$des_file;g" auto_expect_rsync   
                sed -i "s;\$ip;$ip;g" auto_expect_rsync   
                sed -i "s;\$pwd;$pwd;g" auto_expect_rsync   
                chmod +x $path/auto_expect_rsync   
                $path/auto_expect_rsync   
        done < $path/ip_list_config   
}   
auto_ssh()   
{   
        while read iplist   
        do   
                ip=`echo $iplist | awk '{print $1}'`   
                pwd=`echo $iplist | awk '{print $2}'`   
                echo -e "$iplist\n"   
                echo "ssh root@$ip"   
                sed -e "s;source;;g" auto_expect>auto_expect_ssh   
                sed -i "s;rsync -avzP;ssh;g" auto_expect_ssh   
                sed -i "s;:dest;;g" auto_expect_ssh   
                sed -i "s;\$ip;$ip;g" auto_expect_ssh   
                sed -i "s;\$pwd;$pwd;g" auto_expect_ssh   
                chmod +x $path/auto_expect_ssh   
        done < $path/ip_list_config   
        exit 1   
}   
if [ $# -ne 4 ];then   
        echo -e "\e[32;5;1m please input current!! \e[0m\n"   
        show_usage;   
        exit 1;   
fi   
   
while true   
do   
        case "$1" in   
        -h | -help)   
        show_usage   
        ;;   
        -s | -source) source_file=$2   
        echo $soutce_file   
        shift 2   
        ;;   
        -d | -dest) des_file=$2   
        echo $des_file   
        auto_rsync   
        auto_ssh   
        ;;   
        *)   
        show_usage   
        exit 1   
        ;;   
        esac   
done

执行

sh sync_file.sh -s source_file -d des_file
  • -s:源文件地址
  • -d:传输到的目的地址
© 版权声明
THE END