介绍
expect命令是一个自动化工具,可以根据脚本与其他交互式程序进行交互,通过在脚本中设定期望值和响应值进行交互操作,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
expect中,有三个重要的主命令,分别是spawn、expect、exp_send,这三个命令几乎存在于所有expect脚本中,除了这些之外,还有很多expect所特有的参数、变量,它们也作用于expect的方方面面。
spawn激活,send发送到交互命令。
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
暂无评论内容