*unix下有许多程序需要和人交互,例如ssh、ftp、passwd、telnet等,在脚本中用到时需要手动处理很不利于自动化,expect就是代替用户自动处理这类交互的工具。免去交互过程大幅提高工作效率。

一、安装

expect依赖tcl脚本语言,这两个包centos源默认都有,直接yum安装:

yum install expect

expect也有移植到python和perl的版本,不多说。

二、用法

1. 常用expect命令参数

  • “-c” 直接在命令行下执行
  • “-d” 执行代码时输出调试信息
  • “-b” 逐行执行脚本

2. 常用expect内部命令

  • set 设置变量
  • spawn 调用执行的命令
  • expect 判断输出内容是否包含字符串
  • send 执行交互,发送要手动输入的内容
  • puts 输入输出
  • interact 完成交互,把控制权交给控制台。如果是执行完命令退出:interact eof

举个ssh登录的例子:

#!/usr/bin/expect -f 
set ip 127.0.0.1
set password 123123
set user root
set timeout 5
spawn ssh $user@$ip
expect {
"*yes/no"  {send "yes\r";exp_continue}
"*password:" {send "$password\r"}
}
puts "\rexpect login finished\r"
interact

也可以使用“-c”参数从命令行执行:

expect -c "set timeout 5;spawn ssh root@127.0.0.1;expect *yes/no {send yes\r} *password {send 123123\r};interact"

如果在定时任务中调用了expect脚本,可能会出现无法成功执行的情况,需将脚本结尾的:

interact

改为:

expect eof
exit    

参考文章:
http://blog.csdn.net/leexide/article/details/17485451
http://www.cnblogs.com/arlenhou/p/learn_expect.html