【shell】expect的使用案例
时间:2013-09-11 11:09:42 作者:beebol 标签: bash_profile expect 分类: Linux基础 Shell
今天vaster问我,如何检测linux的信任做好了没?我就说直接ssh,设置超时时间,或者用expect。后来她说用不好expect,所以我在终端直接给他写了个急用。因为下班了,要回家,也没有做太多解释,写出来了,理解肯定没有什么问题。也不是她不会,主要是写得太少了。expect使用方法就不说了,网上多得很。我就直接写几个例子吧。
(一)并发检查服务器与DB的连通性:
#!/bin/bash IPLIST="/home/oper/admin/webtool/iplist.txt" THREAD=10 #设置并发数量 TMPFIFO=/tmp/$$.fifo mkfifo $TMPFIFO exec 3<>${TMPFIFO} rm -rf ${TMPFIFO} for((i=1;i<=$THREAD;i++)) do echo ;done >&3 done >&3
循环检查需要检测db连通性的服务器
for i in $(cat ${IPLIST} | grep -v "^#" |awk '{print $1}') do read -u3 { #登录到服务器,记住一定要设置超时时间,防止连接不上服务器,浪费时间。 #ConnectTimeout连接超时时间,ConnectionAttempts超时次数 ssh -oConnectTimeout=30 -oConnectionAttempts=3 $i " for j in \$(cat /etc/odbc.ini |grep SERVER | awk '{print \$3}') #这里获得服务器需要连接的DB服务器 do num=\$(expect -c \" set timeout 2; #设置telnet超时时间 spawn telnet \$j 3306; #这里用mysql举例 expect EOF \" |grep Connected |wc -l) #判断是否有Connected出现,有就表示连通性是正常的。 if [ \$num -eq 1 ];then echo -e \"\e[1;32m$i to \${j} is OK\e[0m\" else echo -e \"\e[1;31m$i to \${j} is error\e[0m\" fi done " echo "" >&3 } & done exec 3>&- waitexit 0 exit 0
(三)下面这个例子是用自己的用户登录服务器后,所有的操作需要切换到oper用户下,每次切换太麻烦了,所以用expect写了几句脚本,然后放到~/.bash_profile,每次登录自己的用户自动切换到操作用户下。方便了许多。
$cat .bash_profile cd ~/ && ./autosu.exp ################################# $cat autosu.exp #!/usr/bin/expect -f set timeout 10 spawn su - oper expect { "Password:" {send "123456\r"} }interact #一定要加上这个,表示不中断,一直保持在oper用户下 interact #一定要加上这个,表示不中断,一直保持在oper用户下
检查连通性的时间一定要设置超时时间,有一次有个同学检测到DB的连通性,有可能脚本执行了好几次。那telnet还在,大家都知道,DB分给应用的连接数是有限制的,导致DB连接数不够。导致维护应用的时候连接不上DB。重要吧!!!!