Expect脚本

Linux Expect 交互脚本


expect 脚本

expect 是用来进行自动化控制和测试的工具。主要是和交互式软件 telnet ftp passwd fsck rlogin ssh tip 等进行自动化的交互。

Linux 交互命令中经常需要输入 yes/no 或者 password 等操作,模拟这些输入,就可以使用 expect 脚本。

expect 是由 tcl 语言演变而来的。简单地说,expect 是一个工具,可以根据用户设定的规则和系统进程进行自动化交互,例如远程登陆的密码输入、自动化的执行远程命令。

mac 自带 expect 脚本工具。


常用命令

spawn 启动进程(由 spawn 启动的进程的输出可以被 expect 所捕获) expect 从进程接收字符串,期望获得字符串 send 向进程发送字符串,用于模拟用户的输入,注意最后一定要加 \r回车 或 \n换行 才能真正发出去。 interact 用户交互。表示执行完成后保持交互状态,把控制权交给控制台 sleep n 使脚本暂停给定的秒数

$argc expect 脚本的参数个数 $argv expect 脚本的参数数组,使用 [lindex $argv n] 获取第 n 个参数,0 是第一个参数

exp_continue 继续执行后续 expect eof 结束当前 spawn 开启的进程。

单一分支语法

set password 123456
expect "*assword:" { send "$password\r" }

当输出中匹配*assword:时,输出password变量的数值和回车。

expect 多行期望

有时执行 shell 后预期结果是不固定的,有可能是询问是yes/no,有可能是去输入密码 此时可以使用多分支模式语法 expect{} 花括号内放多行语句,从上至下匹配,匹配到哪个expect,则执行哪句。 这里如果匹配到第一行会执行第一行;然后第一行的执行结果如果匹配到第二行也会执行第三行; 如果某一行没有匹配到会向下寻找匹配到的那一行进行执行

set password 123456
expect {
      "(yes/no)?" { send "yes\r"; exp_continue; }
      "*password:" { send "$password\r" }
}

当输出中包含(yes/no)?时,输出yes和回车,同时重新执行此多分支 expect 语句。 当输出中匹配*assword:时,输出password变量的数值和回车。