linux expect的使用

expect的介绍

Expect是一种TCL扩展性的语言,主要用于完成系统交互方面的功能,比如SSH、FTP等,这些程序都需要手工与它们进行互动,而使用Expect就可以模拟人手工互动的过程,使用一种自动的方式控制。

Expect中,有三个重要的主命令,分别是spawn、expect、exp_send,这三个命令几乎存在于所有Expect脚本中,除了这些之外,还有很多Expect所特有的参数、变量,它们也作用与Expect的方方面面。

expect的使用

spawn命令

spawn命令是Expect的初始命令,它用于启动一个进程,之后所有expect操作都在这个进程中进行,如果没有spawn语句,整个expect就无法再进行下去了,使用方法就像下面这样:

spawn  ssh  [email protected]

在spawn命令后面,直接加上要启动的进程等信息

当然,如果真的不要spawn过程也没有关系,虽然这样就没有办法单独执行,但是这个脚本可以与任何调用它的进程进行交互。

除此之外,spawn还支持其他选项:

-open 启动文件进程,具体说明请参照下面的选项部分。

-ignore 忽略某些信号,具体说明请参照下面的选项部分。

expect

使用方法:

expect 表达式 动作 表达式 动作 ………………

expect命令用于等候一个相匹配的输出,一旦匹配就执行后面的动作,这个命令接受几个特有参数,用的最多的就是-re,表示使用正则表达式的方式匹配,使用起来就像这样:

spawn  ssh  [email protected]

expect  “password:” {exp_send  “word\r”}

从上面的例子可以看出,expect是依附与spawn命令的,当执行ssh命令后,expect就匹配命令执行后的关键字:password:,如果匹配到关键字就会执行后面包含在{}括号中的exp_send动作,匹配以及动作可以放在二行,这样就不需要使用{}括号了,就像下面这样,实际完成的功能与上面是一样的:

spawn ssh [email protected]

expect  “password:”

exp_send “word\r”

expect命令还有一种用法,它可以在一个expect匹配中同时匹配多个关键字,只需要将关键字放在一个大括号中就可以了:

spawn  ssh  [email protected]

expect  {

   -re  “password:” {exp_send  “word\r”}

   -re  “TopsecOS#” { }

}

上面的例子中,在一个expect匹配中可以匹配二个不同情况,如果发现有password:字符就执行后面的动作,而发现的是另外一个TopsecOS#时,因为后面的动作为空,就会退出这个expect动作

set 设置 Expect变量

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

set 变量名 变量值 #设置变量的方法

puts $变量名 #读取变量的方法

log_file

log_file命令用来将输出记录到一个文件中去,使用格式如下:

log_file <选项> 文件名

选项包括下面几种:

-open 当一个文件已经被打开时,使用这个选项可以往这个文件里继续添加内容,这个选项一般用于windows系统,因为windows系统中文件是独占的,Linux系统中就不存在这个问题了。

-leaveopen 当文件已经被打开时,不继续向这个文件中添加内容。

-noappend 如果文件已存在,那么清空文件中的内容,然后再写入。

-a 如果文件已存在,则将新内容附加到当前文件的末尾。

当这个命令带有文件名时,表示将spawn程序的标准输出记录到文件中,只使用log_file命令但不带文件名则表示关闭记录,这样你就可以只记录自己感兴趣的部分了。

expect 例子

ssh_exec(){
    ip=$1
    user=$2
    passwd=$3
    cmdstr=$4
    /usr/bin/expect <<EOF
    set time 10
    spawn ssh $user@$1
    expect {
    "*yes/no" { send "yes\r"; exp_continue}
    "*password:" {send "$passwd\r"} 
    }
    expect "*#"
    expect "*#"
    send "$cmdstr\r"
    expect "*#"
    send "exit\r"
    expect eof
EOF
}
发布了44 篇原创文章 · 获赞 0 · 访问量 1001

猜你喜欢

转载自blog.csdn.net/LTC_1234/article/details/104314033