在linux下进行一些操作时,有时需要与机器进行一些交互操作,比如切换账号时输入账号密码,传输文件时输入账号密码登陆远程机器等,但有时候这些动作需要在shell脚本中进行,这个时候就可以使用expect来进行自动的交互操作,从而避免需要人工干预引起的脚本中断执行。
expect的核心命令:spawn expect send set
spawn 调用要执行的命令
expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:
send 发送需要交互的值,替代了用户手动输入内容
set 设置变量值
interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif
(expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。)
例子:建一个scp.sh脚本,用来传输文件
#!/bin/sh svr="9.84.214.35" expect <<! spawn scp -r xman@$svr:/db2info.csv /tmp/db2info.txt expect { "(yes/no)?" { send "yes " expect "*assword:" {send "1qaz2wsx "} } "*assword:" { send "1qaz2wsx " } } expect "100%" expect eof !
执行./scp.sh就会使用账户xman,去登陆远程机器,这是终端会给出提示信息问是否继续Yes/No? 如果yes就输入密码,登陆成功后scp命令就开始传文件。其中expect{}里面的代码就是预判断终端输出的内容里是否有(yes/no)?,如果有就自动输入yes,(send "yes ");然后再判断后面的输出里是否含有*password:",如果有就自动输入预置的密码1qaz2wsx。从而达到自动进行交互的目的。
除了用 expect <<! !方式(here document方式)在sh中调用expect外,当然也可以用expect -c "" 的方式在sh脚本里调用expect命令。