简介
expect主要解决shell脚本中不可交互的问题,使用expect能用非交互方式完成交互问题,比如:ssh自动登录。
expect用的是tcl语法,不是shell语法。
安装
linux安装:
yum install expect -y
注: mac自带expect工具。
常用命令
- 设置超时
set timeout 30 # 单位:秒 (-1为永不超时)
- spawn命令:激活一个Unix程序来进行交互式的运行。
spawn ssh -l username 192.168.1.1
- send命令:向进程发送字符串,模拟用户的输入,不能自动回车换行,一般要加 \n 或 \r 。
- expect命令:捕捉spawn进程输出是否包含指定字符串,有则立即返回,或超时返回
注: expect支持匹配模式。
#当进程输出AAA,则发送aaa并回车。
expect "AAA" {send "aaa\r"}
- 脚本结尾:
interact:执行完成后保持交互状态,把控制权交给控制台
expect eof:执行完结束进程
interact
expect eof
exp_continue:允许expect继续向下执行指令
# expect只要匹配了aaa 或bbb或ccc中的任何一个,便退出此expect语句
expect {
"aaa" {send "AAA\r"}
"bbb" {send "BBB\r"}
"ccc" {send "CCC\r"}
}
# exp_continue 用法
expect {
"aaa" {send "AAA\r";exp_continue} # expect匹配完“aaa”,会继续往下匹配;
"bbb" {send "BBB\r";exp_continue}
"ccc" {send "CCC\r"}
}
- 输入:$argv参数数组。
set hostname [lindex $argv 0]
# 变量定义 接收bash传入的第一个参数赋值给hostname变量
# [lindex $argv 0] 表示第一个参数,
# [lindex $argv 1] 表示第二个参数, 。。。
- 输出:puts 和 send_user ,相当于echo。
# 输出hostname变量
puts $hostname
send_user $hostname
注:大部分时候puts和send_user可以互相取代,只要注意其中的不同即可。
相关阅读
https://blog.csdn.net/CN_TangZheng/article/details/103388445
https://blog.csdn.net/daihaoxin/article/details/106014683
https://www.phpernote.com/linux/1479.html
https://blog.csdn.net/qq_36748278/article/details/84399416