本公众号内容大多由平时操作记录,如果有错误地方欢迎留言指
expect使用场景
有时候需要批量地执行一些操作,或者执行自动化的操作的时候,有些指令需要交互式地进行这就会有很多麻烦,linux下有一个程序交expect,它可以模拟键盘输入文本,省去人工干预交互式的指令
expect工作方式
首先使用 spawn 开启一个会话,然后使用 expect-send 对来执行交互式操作。
spawn 后面跟上一个命令操作,表示开启一个会话。expect 等待输出特定的字符串(通常是提示符),然后使用send 发送交互字符串。比如:
安装expect
正常情况下linux默认没有安装这个软件,需要自己安装;
基本语法使用
expect可以写成独立的格式,脚本格式为
!/usr/bin/expect
也可以嵌套在shell脚本中使用
set
设置会话超时时间
set timeout 5
spawn
spawn 后面跟一个shell命令,就是开启了一个会话
例如:
expect-send
expect接收 spwan 后面的命令执行的输出,然后和期望字符串匹配,若对应匹配则执行相应的send来发送交互信息;
expect 使用 ‘{ }’表示一组表达式,且花括号前后要留空格
例如:
expect还可以使用多字符匹配:如下
结束符
expect eof
expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了
expect一般用于登录ssh服务器,除了ssh命令输入密码外,还有scp也是需要密码输入的,因此expect与scp结合起来使用的场景也是很多的。
实例:自动推送秘钥文件到远程主机
试想,如果要实现一些自动化的工作时,免密远程登录是必不可少的,假如在部署ansible前要将ansible的秘钥文件推送给100台服务器,这个时候在脚本中使用scp指令避免不了要进行交互式地应答,(使用ansible的authoried_keys模块的方式推送就另说了)这个时候就需要使用expect来进行自动应答地执行了
编写shell脚本,在脚本中调用expect来实现自动向远处主机推送秘钥:
执行结果:要分发秘钥的主机会自动生成秘钥文件并将秘钥文件推送给ip.txt文件列表中的主机
测试一下:
领取专属 10元无门槛券
私享最新 技术干货