expect命令

expect命令

1.什么是expect

    expect是基于TCL的相对简单的一个免费的脚本编程工具语言,用来实现自动和交互式任务程序语言进行通信,无需人工干预,其作者定义为:expect is a software suite for automating interactive tools

2.expect程序的工作流程

    except的工作流程可以理解为: spawn启动进程 --> expect期待关键字 --> send向进程发送字符 --> 退出结束

3.安装except

yum install expect -y

4.一个小实例

#!/usr/bin/expect
spawn ssh -p22 root@192.168.1.25 /usr/sbin/ifconfig -a
set timeout 60
expect "*password:" {send "root1234\n"}
expect eof
exit

5.expect语法

    expect命令的语法:

命令 [选项] 参数

5.1 spwan

    spwan命令是expect的初始命令,它启动一个进程,之后所有expect操作都在这个进程中进行,其使用方法如下:

spwan ssh root@192.168.1.26

    在spwan命令后面,直接加上要启动的进程、命令等信息,除此之外,还支持其他选项:

-open      启动文件进程,具体说明请自行查阅
-ignore    忽略某些信号,具体说明请自行查阅

5.2 expect

    使用方法:

expect 表达式 动作 表达式 动作 ... ...

    expect命令用于等候一个相匹配内容的输出,一旦匹配则执行expect后面的动作命令,这个命令接收几个特有参数,用的最多的就是-re,表示使用正则表达式进行匹配,如下:

spwan ssh root@192.168.1.26
expect -re ".*password" {send "root1234\r"}

    expect是依附与spwan命令的,当执行ssh命令后,expect就会匹配命令执行后的输出,然后执行expect后面包含在{}中的send或exp_send动作,匹配及动作可以放在下一行,就可以省略{},如下:

spwan ssh root@192.168.1.26
expect -re ".*password" 
send "root1234\r"

5.3 exp_send和send

    在上面的介绍中,我们看到了exp_send命令的使用,exp_send是expect中的动作,send和其作用一样。exp_send命令可以发送一些特殊符号:

\r      回车
\n      换行
\t      制表符

    send命令还有几个可选的参数:

-i      指定spwan_id, 这个参数用来向不同的spwan_id的进程发送命令,是进行多进程控制的关键参数。
-s      s代表slowly,也就是控制发送的速度,这个参数使用的时候要与expect中的变量send_slow向关联

5.4 exp_continue

    这个命令一般用在动作中,它被使用的条件比较苛刻,例子:

#!/usr/bin/expect
spwan ssh -p22 root@192.168.1.26 /usr/sbin/ifconfig eth0
set timeout 60
expect {
    -timeout 1
    "yes/no" { exp_send "yes\r"; exp_continue }
    "*password:" { exp_send "root1234\r" }
    timeout { puts "expect was timeout"; return }
}
expect eof
exit

    个人理解:spwan后面的命令的输出,从第一行开始进行expect遍历匹配,若匹配则执行动作,不匹配则进行下条匹配,而exp_continue的作用是,若不匹配则跳过此行输出,并进行第二行输出进行expect的匹配

5.5 send_user

    send_user用于把后面的参数输出到标准输出中去,默认的send、exp_send都是将参数输出到程序中去,用法:

send_user "please input password:"

    这样就可以在标准输出中打印please input password:字符了。

#!/usr/bin/expect
if { $argc != 3 } {
    send_user "usage: expect scp-expect.exp file host dir\n"
    exit
}

5.6 exit

    exit命令功能很简单,就是直接退出脚本,但可以利用这个命令做一些扫尾工作,如:

exit -onexit {
    exec rm $tmpfile
    send_user "Good Bye\n"
}

6. expect变量

    expect中有很多有用的变量,他们的使用方法与TCL中的变量相同,如:

set   变量名 变量值   # 设置变量的方法
puts  $变量名         # 读取变量的方法

# define var
set file [lindex $argv 0] # 取命令行参数的
set host [lindex $argv 1]
set dir  [lindex $argv 2]
set password "root1234"

7. expcct关键字

    expect中的关键字用于匹配过程,代表某些特殊含义或状态,一般用于expect命令中而不能在外面使用,也可以理解为事件,如:

expect eof {}

7.1 eof

    eof(end-of-file)关键字用于匹配结束符,比如文件、ftp传输停止等,在这个关键字后跟上动作来做进一步的控制,特别是ftp交互操作方面,他的作用很大,如:

spawn ftp root@192.168.1.26
expect {
    "password:" {exp_send "root1234"}
    eof { ftp connect close }
}
interact { }

    interact也是关键字,可以是当前停留在服务端,交互模式使用

7.2 timeout

    timeout是expect中的一个重要变量,它是一个全局性的时间控制开关,你可以通过为这个变量赋值来规定整个expect操作的时间,注意这个变量是服务与expect全局的。例子:

set timeout 60
spawn ssh root@192.168.1.26
expect "*password:" { send "root1234\n" }
expect timeout {puts "timeout"; return }

    先将超时间设置为60秒,当程序阻塞到60秒,就会激活timeout动作。

    另一种设置timeout的方法,如下:

spwan ssh root@192.168.1.26
expect {
    -timeout 60
    -re "password:" {exp_send "root1234\r"}
    -re "TopsecOS#" { }
    timeout { puts "timeout"; return }
}


作者:飘荡着呢
链接:https://www.jianshu.com/p/32de653aa05a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

联系我们

联系电话

4000-640-466

联系邮箱

service@f-li.cn

办公地址

上海黄浦区外滩源1号

谢谢,您的信息已成功发送。
请填写信息。