expect是linux上的一种人机交互的一套工具,它里面的命令能完成数据的接受、发送以及新进程的启动
参数:
1、spawn:新建一个进程,这个进程的交互由expect控制
2、expect等待接收进程返回的字符串,直到超时时间,根据规则决定下一步操作
3、send发送字符串给expect控制的进程去执行
4、set设置变量为某个值
5、exp_continue:重新执行expect命令分支
6、expect eof 等待spawn进程结束后退出信号eof
shell 中套用expect脚本:
方法1:使用expect -c "expect语句"
方法二:/bin/expect <<-eof
代码。。。。。。。
eof
案例一:使用方法一来进行批量主机执行某个命令
一、主机ip文件
192.168.161.80 root 22 123456
192.168.161.90 root 22 123456
Color="echo -e \\033[31m"
End='\033[0m'
Host_list='/tmp/host_info.list'
Info=$*
[ ! -f "${Host_list}" ] || { echo "${Host_list} not exist" ; exit 1; }
for ip in $(awk '{print $1}' $Host_list)
do
User=$(awk -v ii=$ip '$1==ii {print $2}' $Host_list)
Port=$(awk -v ii=$ip '$1==ii {print $3}' $Host_list)
Password=$(awk -v ii=$ip '$1==ii{print $4}' $Host_list)
expect -c "
spawn ssh -p $Port $User@$ip
expect {
\"(yes/no)\" {send \"yes\r\" ;exp_continue}
\"password:\" {send \"$Password\r\" ;exp_continue}
\"$User@*\" {send \"$Info\r exit \r\";exp_continue}
}
"
${Color}"---------------------------------------------------------------------------------"${End}
done
案例二:把ssh公钥传递给当前网段中所有存活主机
#定义用户密码
pass=123456
#清空文件
>/tmp/ip.txt
#查看是否安装了expect命令,如果没有安装则进行安装
rpm -q expect &>/dev/null
if [ $? -ne 0 ];then
yum install expect -y
fi
#判断是否存在私钥,不存在密钥对则生成秘钥对
if [ ! -f ~/.ssh/id_rsa ];then
ssh-keygen -f ~/.ssh/id_rsa -P ""
fi
#后台执行,判断存活的主机,存活则指向新文件
for i in {2..254}
do
{
ip=192.168.161.$i
ping -W 2 -c 3 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip" >>/tmp/ip.txt
/usr/bin/expect <<-eof
spawn ssh-copy-id $ip
expect {
"yes/no" {send "yes\r" ;exp_continue}
"password" {send "$pass\r"}
}
expect eof
eof
fi
}&
done
wait
echo "finish.............."
#备注:这种方式存在一定的不可行性, 生产中还是以案例一中存在的主机ip、用户、端口、密码这样去变量,比较适用。这里仅仅是提供一种expect的使用的方法