expect脚本
expect介绍
expect 是一个用来处理交互的命令。借助 expect 可以将交互过程写在一个脚本里,就可以实现自动化完成,无须用户输入
mac下安装
- 安装homebrew
-
brew install expect
安装expect
启用选项
-
-c
:执行脚本前先执行的命令,可多次使用。 -
-d
:debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1
相似。 -
-D
:启用交换调式器,可设一整数参数。 -
-f
:从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。 -
-i
:交互式输入命令,使用"exit"或"EOF"退出输入状态。expect eof
expect exit
-
--
:标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!
行:#!/usr/bin/expect --
。 -
-v
:显示expect版本信息。
变量
-
set varible xxx
设置变量varible为xxx -
$varible
获取变量 -
set timeout n
设置超时时间为n秒 -
set timeout -1 timeout
时间设置为无限时 -
设置使用参数变量
touch test sudo chmod +x ./test ./test meng run
#questions文件 #!/bin/bash echo "Hello, who are you?" read $REPLY #不加read,会导致下面expect执行的时候,参数1和参数2在最后展示 echo "Can I ask you some questions?" read $REPLY echo "What is your favorite topic?" read $REPLY
#test文件 #设置变量varible1为expect的第一个参数(可使用$varible1获取参数1) #不同于shell script,shell第一个参数为$1 #!/usr/bin/expect -f set my_name [lindex $argv 0] set my_favorite [lindex $argv 1] set timeout -1 spawn ./questions expect "Hello, who are you?\r" send -- "Im $my_name\r" expect "Can I ask you some questions?\r" send -- "Sure\r" expect "What is your favorite topic?\r" send -- "$my_favorite\r" expect eof
条件测试
使用大括号编写条件测试
expect {
"something" { send -- "send this\r" }
"*another" { send -- "send another\r" }
}
-
if elseif
puts
类似shell脚本的echo,将内容输出到控制台#!/usr/bin/expect -f set NUM 1 if { $NUM < 5 } { puts "\Smaller than 5\n" } elseif { $NUM > 5 } { puts "\Bigger than 5\n" } else { puts "\Equals 5\n" }
-
while循环(while循环必须使用花括号来包含)
#!/usr/bin/expect -f set NUM 0 while { $NUM <= 5 } { puts "\nNumber is $NUM" set NUM [ expr $NUM + 1 ] } puts ""
-
for循环
#!/usr/bin/expect -f for {set NUM 0} {$NUM <= 5} {incr NUM} { puts "\nNUM = $NUM" } puts ""
函数
proc 函数名 {参数} {
xxxx
}
[函数名 参数]
#!/usr/bin/expect -f
proc myfunc { TOTAL } {
set TOTAL [expr $TOTAL + 1]
return "$TOTAL"
}
set NUM 0
while {$NUM <= 5} {
puts "\nNumber $NUM"
set NUM [myfunc $NUM]
}
puts ""
用法
-
send
:用于向进程发送字符串(代替用户手动输入) -
expect
:从进程接收字符串(也可以是正则),匹配脚本的反馈-
$expect_out(buffer)
匹配到的是所有输入 -
$expect_out(0,string)
匹配到 expect 参数的输入 -
expect 'password:' {send "$passwd"}
匹配password
-
-
spawn
:启动新的进程-
spawn ssh aaa@qq.com -p port
开启ssh连接
-
-
interact
:允许用户交互有时,您的Expect脚本包含一些您不想与使用Expect脚本的其他用户共享的敏感信息,例如密码或任何其他数据,因此您希望脚本从您那里获取此密码并继续正常进行自动化。
interact命令将控件还原回键盘。执行此命令后,Expect将开始从键盘读取。
-
puts
类似shell脚本的echo,将内容输出到控制台 -
set varible xxx
设置变量varible为xxx
上一篇: 设置cd默认路径加快cd操作
下一篇: Bash下echo踩坑,关于感叹号和转义