shell自动化交互expect
阅读数:88 评论数:0
跳转到新版页面分类
Linux
正文
一、expect介绍
expect是用来实现自动化交互功能的软件。
1、安装
(1)Centos
yum install -y expect
(2)debian或ubuntu
sudo apt-get install expect
2、四个基础命令
(1)spawn
用来启动新的进程
例如
spawn passwd root
(2)expect
判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则等待超时时间后返回。
(3)send
向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加\r或\n。
多条send命令会并行执行,如果需要多条并行,建议使用shell的管道符拼接的方式,如果要串行,最好一条send一条expect。(在脚本中使用中文可能会产生莫名的执行错误)
expect "密码"{ send "abc123\r" } //同一行send部分要有{}
expect "密码"
send "abc123\r" //换行send部分不需要有{}
expect支持多个分支
expect {
"string1" {
# 执行某个操作
}
"string2" {
# 执行另一个操作
}
}
#这会在匹配到 "string1" 后,继续等待匹配 "string2"
expect {
"string1" {
# 执行某个操作
exp_continue
}
"string2" {
# 执行另一个操作
}
}
(4)interact和expect of的区别
expect eof表示交互结束,退回到原用户,脚本默认是等待10s。默认的超时时间是10秒,通过 set命令可以设置会话超时时间,若不限制超时时间则应设置为-1。
set timeout 30
interact
当脚本执行到 interact
时,用户可以直接与进程交互,就像直接运行这个进程一样。
3、常用选项
-c | 执行脚本前先执行的命令,可多次使用 |
-d | debug模式 |
-f | 从文件读取命令,仅用于使用#!时, |
-i | 交互式输入命令,使用exit或EOF退出输入状态 |
4、接收参数
expect 脚本可以接受从 bash 命令行传递的参数,使用[lindex $argv n] 获得。
其中 n 从0开始,分别表示第一个, 第二个,第三个…参数。
set hostname [lindex $argv 0] #相当于 hostname=$1
set password [lindex $argv 1] #相当于 password=$2
#expect直接执行,需要使用 expect 命令去执行脚本
5、exp_continue
exp_continue 附加于某个 expect 判断项之后,可以使该项匹配后,还能继续匹配该 expect 判断语句内的其他项
exp_continue 类似于控制语句中 continue 语句,表示允许 expect 继续向下执行指令
expect {
"(yes/no)" {send "yes\r"; exp_ continue; }
"*password" {set timeout 300; send "abc123\r";}
}
6、控制结构
(1)if
if {condition} {
# 执行某个操作
} else {
# 执行另一个操作
}
(2)for
for {set i 0} {$i < 10} {incr i} {
# 执行循环操作
}
(3)while
while {condition} {
# 执行循环操作
}
7、变量
在 Expect 脚本中,可以使用 set
命令设置变量:
set variable_name value
要访问变量的值,可以使用 $variable_name
。
8、获得进程输出
Expect 可以将进程的输出存储在变量中,以便后续处理。这可以通过 $expect_out(buffer)
或 $expect_out(0,string)
等形式实现:
expect "string"
set output $expect_out(buffer)
Expect 还支持使用正则表达式匹配
输出,并将匹配的子串存储在 $expect_out(1,string)
、$expect_out(2,string)
等变量中:
expect -re "(string1)(string2)"
set output1 $expect_out(1,string)
set output2 $expect_out(2,string)
二、expect脚本
expect可以直接使用的其它shell中,也可以指定脚本使用expect解释器
#!/usr/bin/expect
exp_internal 1 # 开启调试
但是说实话,我自己是看不懂这个调试输出的。
三、使用实例
1、shell中使用expect -c "expect脚本内容"
#!/bin/sh
echo "begin" #echo 是shell语法
expect -c "
spawn su root
expect \":\"
send \"root\r\"
send \"ls\r\"
expect eof
"
echo "end"
2、shell使用expect <<EOF expect脚本内容 EOF
#!/bin/sh
echo "begin"
expect <<EOF
spawn su root
expect ":"
send "root\r"
expect "root"
send "whoami\r"
expect eof
EOF
whoami