shell脚本之expect语句

在编写shell脚本时,我们可能会遇到一些交互式的情况,如passwd、ssh等等脚本时,常常需要手动进行交互。这样,原本为了实现自动部署的脚本显得有些不大方便,这时你就会用上expect命令了。expect命令可以帮你把交互式命令变成非交互式。


expect 有期待、期望的中文意思。正如它的中文意译一样,它的作用就是帮你将期待的“答案”在交互时帮你加上去。当然,这个答案需要你自己去编写。


shell中expect的相关命令:set(设置) 、spawn(引用)、expect(期待)、send(发送)


set后接设置的变量值

例:set timeout 180 ;  设置180秒超时,即3分钟没有expect内容就退出脚本。


spawn后接要执行的命令,即交互式命令(可调用循环语句)

例:passwd tom;给tom设置密码


expect后接需要捕捉交互时的关键字,这里的关键字指的是执行完交互式命令后出现的唯一关键字。例如上述passwd tom,在Linux中执行后,会在交互行出现唯一关键字“密码:”,在进行消息的第一次交互后,又会在第二次交互行出现唯一关键字“重新”。

image.png


send后接需要交互的值,即对交互时的问题的回复答案。例如前面的例子中对passwd tom的回答,即用户设置的密码,这里以123为例

send “123\n”  (注:\n为回车键)

expect和send通常放到一起使用,交互就是一问一答,expect对交互时“问”的关键字捕捉就充当了一个“问”的角色,而send则是扮演了“答”的角色。


interact是expect命令完成后保持交互状态如果。


expect eof是expect命令的结束语,它和expect的关系就像if和fi,case和esac,while和done的关系,当然也可以用interact作为结束语。


注:以下是脚本中的expect的命令格式,因为没有循环体命令所以没有用上interact命令。expect命令是存放在/usr/bin/expect中,所以在脚本中,我们这里使用重定向的方式使用expect命令。expect  eof命令一定要加在expect语句末尾。

image.png

猜你喜欢

转载自blog.51cto.com/13860705/2366968