首页 > 代码库 > 小型自动化运维--expect入门知识

小型自动化运维--expect入门知识

小型自动化运维--expect入门知识


Expect的自动交互工作流程简单说明:

spawn启动指定进程-->expect获取期待的关键字-->send向指定进程发送指定字符-->进程执行完毕,退出脚本。

  1. spawn命令

    如果没有spawn命令,expect程序将会无法实现自动交互。

    spawn命令的语法为:

    spawn [选项] [需要自动交互的命令或程序]

    例如:spawn ssh root@192.169.5.74 uptime 

    说明:在spawn命令的后面,直接加上要执行的命令或程序(如上例的ssh命令)等,除此之外,spawn还支持一些选项(了解即可!)

    -open:表示启动文件进程;

    -ignore:表示忽略某些信号;

  2. expect命令

    expect命令的语法为:

    expect 表达式 [动作]

    例如:spawn ssh root@192.169.5.74 uptime 

        expect "*password" {send "root\r"}

    说明:上述命令不能直接在linux命令行中执行,需要放入expect脚本中进行。

  3. 根据上述两个命令,写一个简单的expect脚本

    方法一:

    #!/usr/bin/expect    ##可以使用which expect查看

    spawn ssh root@192.169.5.74 uptime

    expect "yes/no" {send "yes\n"}

    expect "*password" {send "root\n"}   ##\n表示换行,这里也可以使用\r表示回车

    expect eof    ##想要输出结果,必须加上eof(end of file),表示expect的结束

    执行的结果如下:

    技术分享

    方法二:

    将expect与send不放在同一行,这样就不需要使用{}(大括号)了,上面的例子可以改成:

    #!/usr/bin/expect

    spawn ssh root@192.169.5.74 uptime

    expect "yes/no"

    send "yes\n"

    expect "*password"

    send "root\n"

    expect eof

    执行的结果如上!

  4. exp_send、exp_continue与多行expect的用法举例

    #!/usr/bin/expect

    spawn ssh root@192.169.5.74 uptime

    expect {

    #   "yes/no" {exp_send "yes\r";exp_continue}

    #   "*password" {exp_send "root\n"}

       "yes/no" {send "yes\r";exp_continue}

       "*password" {send "root\n"}

    }

    expect eof

    说明:(1)exp_send和send类似,后面的\r(回车),\n(换行);

        (2)expect {},类似于多行expect;

        (3)匹配多个字符串,需要在每次匹配并执行动作后,加上exp_continue。

  5. send_user命令,类似shell里的echo命令

    #!/usr/bin/expect

    send_user "My name is wtf.\n"

    send_user "I am a linuxer,\t"  ##制表符

    send_user "My blog is www.wutengfei.blog.51cto.com\n"

    执行的结果如下:

    技术分享

  6. exit命令

    exit命令功能类似于shell中的exit,即直接退出Expect脚本,除了最基本的退出脚本功能之外,还可以利用这个命令对脚本做一些关闭前的清理和提示等工作,举例如下:

    #!/usr/bin/expect

    send_user "My name is wtf.\n"

    send_user "I am a linuxer,\t"

    send_user "My blog is www.wutengfei.blog.51cto.com\n"

    exit -onexit {

      send_user "Good bye.\n"

    }

    执行结果如下:

    技术分享

  7. expect程序变量

    (1)普通变量

    定义变量的基本语法如下:

    set 变量名 变量值

    如:set password "root"

    打印变量的两种方法:

    方法一:

    puts $变量名

    如:puts $password

    方法二:

    send_user "$password\n"

    举例如下:

    #!/usr/bin/expect

    set password "root"

    puts $password

    send_user "$password\n"

    执行结果如下:

    技术分享

    (2)特殊变量

    在Expect里也有与shell脚本里的$0、$1、$#等类似的特殊参数变量,用于接收及控制Expect脚本传参。在Expect中$argv表示参数数组,可以使用[lindex $argv n]接收Expect脚本传参,n从0开始,分别表示第一个[lindex $argv 0]参数,第二个[lindex $argv 1]参数。。。

    说明:[lindex $argv 0]相当于shell中的$1,[lindex $argv 2]相当于shell中的$2;$argv0(相当于shell中$0)表示脚本的名字;$argc(相当于shell中$#)表示参数的总个数。

    #!/usr/bin/expect

    #define var

    set file [lindex $argv 0]

    set host [lindex $argv 1]

    set dir  [lindex $argv 2]

    send_user "$file\t$host\t$dir\n"

    puts "$file\t$host\t$dir\n"

    puts $argv0

    puts $argc

    执行结果如下:

    技术分享


本文出自 “圣骑士控魔之手” 博客,请务必保留此出处http://wutengfei.blog.51cto.com/10942117/1950472

小型自动化运维--expect入门知识