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 eof2) 将上面的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也可以使用这种方式
本文介绍如何使用Expect脚本语言自动化处理SCP命令中的交互过程,包括密码输入等,并提供了一个具体的脚本示例。

902

被折叠的 条评论
为什么被折叠?



