Linux expect

来源:互联网 发布:visio软件官方下载 编辑:程序博客网 时间:2024/06/10 21:05

1 Linux expect

expect据说是交互性很强的脚本语言

我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器,SSH、SCP需要输入密码等进行交互的功能(比如实现SCP自动化运行,而不需要人工输入密码)而Expect就使用来实现这种功能的工具。

2. 安装

查看是否安装  rpm -ql expect

安装:yum install expect*


3.  举例

在之前的文章了说过,我是测试开发,所有很多例子都和测试开发相关,我们有一个场景,需要从 别的服务器上download 我们所需要的文件,只有 ftp 和scp的方法, 由于没有舍子 ftp服务,所以需要 scp 拿数据,但是 scp大家都知道,需要交互,输入scp命令以后需要输入密码,但是我们需要自动化执行,那怎么办呢? 一种方式是连个机器建立信任,由于另外一个机器我们不能随便动,而且这个方法也比较麻烦,所以就采用expect 的方法。举例代码如下


1)书写expect脚本(看不懂暂时不要紧,下面将有详细的解释)


#!/usr/bin/expectset timeout 3600set host [lindex $argv 0]set port [lindex $argv 1]set username [lindex $argv 2]set password [lindex $argv 3]set src_file [lindex $argv 4]set dest_file [lindex $argv 5]#spawn scp $src_file $username@$host:$dest_filespawn scp -P $port -r $username@$host:$dest_file $src_fileexpect { "(yes/no)?" {   send "yes\n"   expect "*assword:" { send "$password\n"}  }  "*assword:" {   send "$password\n"  }}expect "100%"expect eof


2) 将上面的expect脚本保存,但是并不是保存为.sh等shell脚本,而是保存一个名称就好  如:scp_expect

3)执行expect脚本 

./scp_expect  参数


下面将详细解释一下expect脚本

第一行:  #!/usr/bin/expect

解释: 告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。和shell 的 #!/bin/sh是一样的

其实就是expect注意安装的路径,不确定 whereis expect 一下


第二行:set timeout 3600

解释: 3600 代码刚开始还设定了timeout的时间为3600秒,如果在执行scp任务时遇到了代码中没有指定的异常,则在等待3600秒后该脚本的执行会自动终止。


第三行-第八行 : set host [lindex $argv 0]

解释: 获取参数,和其他shell的 $1 $2不同。这个是从下标 1开始的。而且用法是 固定的:[lindex $argv 0 


第10行:spawn scp -P $port -r $username@$host:$dest_file $src_file

scp  命令:spawn是进入expect环境后才可以执行的expect内部命令 


第11行---

expect {
 "(yes/no)?" {       // 交互信息是否包含字符串 yes/no)? 
   send "yes\n"  // 交互信息是否包含字符串 yes/no)?  如果包含,输入yes\n
   expect "*assword:" { send "$password\n"}  // 交互信息是否包含字符串 "*assword"  如果包含,输入$password\n
  }
  "*assword:" {    //scp 的时候有可能需要输入yes/no 下面这个是没有(yes/no)?交互情况下的处理方式
   send "$password\n"
  }
}


最后一行: 

解释: 如果不需要保持交互方式,使用 expect eof 如果想保持交互方式,使用 interact 


4. 

expect几乎都是用户想把交互方式自动化 SSH也可以使用这种方式




0 0