expect自动化实现与交互系统交互的场景,代替人力输入命令,可以方便地批量执行需要交互输入命令的任务。
set timeout 10 //脚本的超时时间
set varname [lindex $argv 0] //获取外部输入的第一个参数,传给变量varname
spawn cmd //启动一个进程
expect "xxx" //等待交互式系统返回的字符串
send "yyy" //expect期待的字符串出现时,发送字符串到交互式系统
interact //保持交互状态,控制权交给控制台,比如登陆完成以后留在终端等待用户操作响应
举个例子,新建login.expect
#!/usr/bin/expect
set timeout 2
spawn ssh [lindex $argv 0]@[lindex $argv 1] -p [lindex $argv 2]
expect {
"(yes/no)?" { send "yes\n"; exp_continue }
"password:" { send "[lindex $argv 2]\n" }
"Password>:" { send "[lindex $argv 2]\n" }
}
interact
这样可以完成自动登录:
./login.expect username hostip passwd
如果出现spawn_id: spawn id exp6 not open while executing这种错误,因为spawn不是shell命令,不能以 sh login.expect执行expect脚本。