在编写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
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语句末尾。
举个切合实际的例子,在经过ansible管理多台同网段的主机前,须要先部署ssh的免密码登陆,假设它们的密码都为0,具体脚本以下:
固然,也能够经过expect实现交互生成公钥私钥对,不过相对麻烦。
本人Linux萌新一枚,若有错误,欢迎指正。