在shell脚本中使用expect

expect是一个用来处理交互的命令。借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成。形象的说,ssh登录,ftp登录等都符合交互的定义。

expect有四个关键命令,作用如下:

  • send:用于向进程发送字符串
  • expect:从进程接收字符串
  • spawn:启动新的进程
  • interact:允许用户交互

关于四个命令的详细用法,这里不做过多介绍,网上资料很多,大家可以自行搜索,下面只列举一个最基本的用法,使用shell脚本登录远程服务器:

#!/usr/bin/expect
spawn ssh [email protected]
expect "*password:"
send "123456\r"
expect eof

我们来看此段代码的第一行,熟悉shell的朋友一定知道,这里是声明下面的代码使用的是expect来解析,但是expect的语法又和平时所用的bash语法不一样,那如果我们希望用熟悉的bash语法该怎么办 呢?看下面的代码:

#!/bin/bash
/usr/bin/expect <<-EOF
# 设置超时时间
set time 30
spawn ssh [email protected]
#这样写比较繁琐,这个示例用下面的写法,可以一次匹配好多参数
#expect "*password:"
#send "13456\r"
expect {
    "*yes/no" {send "yes\r"}
    "*password" {send "123456\r"}
}
expect eof
EOF

echo OK

第一行声明用了我们最熟悉的bash,那么说明里面的内容就可以用bash语法了,在EOF之外,尽情的挥洒bash代码吧!