Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预,它主要由expect-send组成。使用它系统管理员的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。
1、SSH自动登陆主机脚本
#!/usr/bin/expect -f
set timeout 20 #设置后面所有的命令等待时间为20秒
set pwd "admin"
spawn ssh -l peercome 192.168.199.238 #spawn启动脚本和命令的回话
expect { #期望出现的结果(字符),对结果进行对应处理
"lost connection" {
spawn ssh-keygen -f "~/lsm/.ssh/known_hosts" -R 192.168.199.238; #从known_hosts文件中删除所有属于 192.168.199.238 的密钥
exp_continue
}
"(yes/no)" {
send "yes\n";
exp_continue
}
"password:" {
send "$pwd\n";
}
}
#expect eof #登陆后退出
interact #登陆后保留在登陆远程终端上
2、telnet自动登陆主机脚本。
脚本首先从命令行参数中获取登录主机的IP地址,然后调用相关命令进行登录。
#!/usr/bin/expect
set user "admin"
set pwd "admin"
set ip "[lindex $argv 0]"
puts "telnet to : $ip"
spawn telnet $ip
expect {
"login" {
send "$user\n"
exp_continue
}
"Password" {
send "$pwd"
}
}
puts "connect to $ip is ok!"
interact
3、获取函数参数
使用proc定义函数
proc printPerson {name sex age} {
puts "name: $name"
puts "sex: $sex"
puts "age: $age"
}
4、响应规则
expect -re "\[(.*)]:" #-re代表后面不是普通字符,而是正则表达。查找方括号字符后面跟有零个或多个字符,最后是一个右方括号,将其存放在()中,即匹配结果存放到变量中
if {$expect_out(1,string)!="/bin/tcsh"} { #当发现一个配置则检查包含在方括号内的字符,查看是否是“/bin/tcsh”。$expect_out访问匹配数组的数据
send "/bin/tcsh" #如果匹配不成功发送/bin/tcsh
}
send " " #发送回车符
expect eof