Linux--使用expect进行自动交互

在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命令。 


原文地址:https://www.cnblogs.com/jingwei/p/4863554.html