Linux expect

本文介绍如何使用Expect脚本语言自动化处理SCP命令中的交互过程,包括密码输入等,并提供了一个具体的脚本示例。

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/expect
set timeout 3600
set 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_file
spawn scp -P $port -r $username@$host:$dest_file $src_file
expect {
 "(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秒后该脚本的执行会自动终止。


 有的时候timeout 不能随便指定,之前使用expect scp 的指定了timeout,发现scp不完成,最后设置了set timeout -1才完全拷贝 


第三行-第八行 : 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也可以使用这种方式




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值