shell脚本之expect语句

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


expect 有期待、指望的中文意思。正如它的中文意译同样,它的做用就是帮你将期待的“答案”在交互时帮你加上去。固然,这个答案须要你本身去编写。ssh


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


set后接设置的变量值spa

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


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

例:passwd tom;给tom设置密码it


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

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

举个切合实际的例子,在经过ansible管理多台同网段的主机前,须要先部署ssh的免密码登陆,假设它们的密码都为0,具体脚本以下:

image.png

固然,也能够经过expect实现交互生成公钥私钥对,不过相对麻烦。


本人Linux萌新一枚,若有错误,欢迎指正。

相关文章
相关标签/搜索