使用expect脚本的正确姿势

expect是啥就不多说了,不知道的请自行百度之~

这货处理一些自动化的东西还是挺方便的,这里简单的记录一下他的正确使用姿势。

示例代码:

#!/usr/bin/expect

spawn mysql -uroot -p  
expect "*assword:*" { send "test\r" }  
expect "*mysql>*" { send "use test;\r" }  
expect "*mysql>*" { send "delete from test;\r" }  
expect "*mysql>*" { send "exit;\r" }  
expect eof

spawn hadoop fs -rm -r /test/  
expect eof

spawn hive  
expect "*hive>*" { send "drop database test cascade;\r" }  
expect "*hive>*" { send "exit;\r" }  
expect eof  

简单的说一下上面脚本的几个关键点:

spawn用于启动一个命令,启动后接下来expect开始监听输出。

send是发送文本指令,最后\r表示回车符。

命令执行完毕后,务必使用expect eof确保进程正常退出,否则会提前退出子进程的哦。

最常见的使用姿势是:spawn -> expect -> send -> expect eof

以上这些就足够玩的啦。

当然他还有其他的指令,比如set设置一个变量之类的,详细的使用方法还请自己深入之,O(∩_∩)O

补充(2015-10-27)

有时使用expect脚本ssh登录服务器,第一次登录会出现Are you sure you want to continue connecting (yes/no)?这样的提示,再次登录就不会出现,这种情况可以采用这样的方式去处理:

expect "*$*" { send "ssh iam@host\r" }  
expect {  
    "yes/no" { send "yes\r"; exp_continue }
    "password" { send "yourpasswork\r" }
}