expect不是默认的系统安装包,需要额外安装:
#检查时候安装
rpm -qa | grep expect
#安装
yum install expect
#搜索位置
which expect
主要命令
expect实现交互式变成对话,主要依赖于4个命令,这些命令都是expect这个包自带的。
spawn
要执行的命令expect
等待命令提示信息的出现,也就是捕捉用户输入的提示。包含即可send
向屏幕输入字符串。相当于出现提示后,手动输入的内容interact
/expect eof
其中interact
的意思是执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。expect eof
与spawn对应表示捕获终端输出信息终止
使用expect命令的方法
- 脚本在开头就标明使用expect这个库:
#!/usr/bin/expect
- 使用here文档嵌套在bash脚本中:
/usr/bin/expect << eof text eof
- 使用
-c
命令嵌套在bash脚本中:expect -c "内容"
,相关内容可能需要转义,比较麻烦 - 将expect中的内容独立成脚本,在bash脚本中调用:
expect file grgv
一些其他命令的说明
set
可以设置超时,同时也可以设置变量timeout
expect的超时等待时间,默认10s。-1表示永不超时exp_continue
继续执行下面的匹配,有点循环的意思\r
可以理解为回车,每个send后都需要加。目前还不知道是否可以被替代$argc
统计位置参数数量[lindex $argv 0]
脚本中的第一个参数,类似于bash中的$1,以此类推puts
打印字符串,类似于echoexpect{...}
输入多行记录
实例1:简单正常使用
#!/usr/bin/expect -f
spawn ssh [email protected]
expect {
"yes/no" {send "yes\r"; exp_continue}
"password:" {send "root_passwd\r"; exp_continue}
"]" {send "echo \$USER\r"}
}
expect "]"
send "ls\r"
#interact
expect eof
实例2: 包含参数的使用
#!/usr/bin/expect
#set login_ip "10.130.41.130"
#set login_user "root"
#set login_pass "root_passwd"
# 这里展现了两种参数格式
#set login_ip [lrange $argv 0 0]
set login_ip [lindex $argv 0]
set login_user [lrange $argv 1 1]
set login_pass [lrange $argv 2 2]
spawn ssh $login_user@$login_ip
expect {
"yes/no" {send "yes\r"; exp_continue}
"password:" {send "$login_pass\r"; exp_continue}
"]" {send "echo \$USER\r"}
}
expect "]"
send "ls\r"
expect eof
实例3: 使用-c参数调用
#!/usr/bin/bash
expect -c "
spawn ssh [email protected] 'ls'
expect {
\"yes/no\" {send \"yes\\r\"; exp_continue}
\"password:\" {send \"root_passwd\\r\"}
}
#interact
expect eof
"
实例4: 以文件的形式调用
#!/bin/bash
echo "要调用expect了啊,等着啊"
# 这里的文件路径使用的相对路径,expect脚本和当前脚本在同一个目录下
expect test_expect.sh
echo "调用完成了哦"
参考链接:
- https://www.cnblogs.com/regit/p/7985740.html
- https://www.cnblogs.com/lzrabbit/p/4298794.html
- https://www.cnblogs.com/taosim/articles/3785817.html