欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

expect脚本

程序员文章站 2022-05-11 11:11:57
...

expect介绍

expect 是一个用来处理交互的命令。借助 expect 可以将交互过程写在一个脚本里,就可以实现自动化完成,无须用户输入

mac下安装

  1. 安装homebrew
  2. 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脚本

条件测试

使用大括号编写条件测试

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

相关标签: # 脚本