简介
Expect语言是基于Tcl的。Tcl实际上是一个子程序库,这些子程序库可以嵌入到程序里从而提供语言服务。 最终的语言有点象一个典型的 Shell语言。里面有给变量赋值的set命令,控制程序执行的if,for,continue等命令,还能进行普通的数学和字符串操作。当然了,还可以 用exec来调用Unix程序。所有这些功能,Tcl都有。
综述
Expect是在Tcl基础上创建起来的,它还提供了一些Tcl所没有的命令:
1.spawn命令激活一个Unix程序来进行交互式的运行。
2.send命令向进程发送字符串。
3.expect命令等待进程的某些字符串。expect支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作。expect还能理解一些特殊情况,如超时和遇到文件尾。
4.expect命令和Tcl的case命令的风格很相似。都是用一个字符串去匹配多个字符串。(只要有可能,新的命令总是和已有的Tcl命令相似,以使得该语言保持工具族的继承性)。
示例:
yum -y install expect tcl tclx tcl-devel
通过expect解决ssh交互的问题
#!/usr/bin/expect
set timeout 10 #设置超时等待时间
spawn ssh root@192.168.50.122 #使用spawn 执行unix程序开始交互
expect { #交互内容
"yes/no" { send "yes\r";exp_continue } #"yes/no"关键字匹配,"exp_continue"表示如果没有匹配到该项,则跳过。
"password:" { send "666666\r" }; #"password:"关键字匹配
}
interact #停留在交互界面
使用expect进行批量公钥推送
touch /ssh-copy-id.expect
#!/usr/bin/expect
set timeout 10
spawn ssh-copy-id ${ip}
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "666666\r" };
}
#!/bin/bash
>ip.txt ##清空记录文本
for i in {1..255}
do
{
ip=192.168.1.${i}
ping -c1 -W1 ${ip} &> /dev/null
if [ ${?} -eq 0 ] ; then
echo "${ip}" | tee -a ip.txt
/usr/bin/expect /ssh-copy-id.expect
fi
} & ##后台执行
done
wait
echo "ping finish..."
文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/6080