shell expect


expect 用于自动化交互

1.安装

expect是基于 tcl 语言,需要安装tcl

(1)准备tcl,expect源码包

(2)配置编译安装

mwget https://nchc.dl.sourceforge.net/project/tcl/Tcl/8.6.9/tcl8.6.9-src.tar.gz
tar xf tcl8.6.9-src.tar.gz
cd tcl8.6.9/unix/
./configure && make && sudo make install
mwget https://nchc.dl.sourceforge.net/project/expect/Expect/5.45.4/expect5.45.4.tar.gz
tar xf expect5.45.4.tar.gz
cd ./expect5.45.4
./configure && make && sudo make install

mwget 下载

wget http://jaist.dl.sourceforge.net/project/kmphpfm/mwget/0.1/mwget_0.1.0.orig.tar.bz2
tar -xjvf mwget_0.1.0.orig.tar.bz2 -C /usr/local/src/
cd /usr/local/src/mwget_0.1.0.orig
./configure
make
make install

2.expect的命令

expect的核心是spawn、expect、send、set。

(1)spawn调用要执行的命令

(2)expect监听交互输出

(3)send进行交互输入

(3)set设置变量值

(4)interact交互完后,将控制权交给控制台。

(5)expect eof,与spawn对应,表示捕捉终端输出信息终止,类似if...endif

其他设置

set timeout -1,设置expect永不超时

set timeout 300,如果300后没有捕捉到expect的监听的内容,那么就退出

3.expect的语法

expect使用的是tcl语法

基本如下,

(1)命令之后是参数,互相用空格间隔

cmd arg arg arg

 (2)使用变量

set var 1000  # 定义变量
set var [lindex $argv 0] #将 var = argv[0]
$foo

 (3)嵌套命令,将一个命令的输出,作为另一个命令的输入参数

cmd1 [cmd2 arg]

 (4)双引号,将词组标记为一个参数,双引号内$符号有效

cmd "hello world $foo"

(5)大括号, 将词组标记为一个参数,但大括号内无法扩展变量

cmd {hello world}

 (6)反斜线,转义

 

3.示例:

首先有一个交互程序main.c

#include <stdio.h>

int main(int argc, char **argv)
{
        int i = 0;
        char buf[BUFSIZ] = {0};
        for (i = 0; i < argc; i++)
                printf("argv[%d]:%s\n", i, argv[i]);

        for (i = 0; i < 4; i++) {
                printf("input\n");
                gets(buf);
                puts(buf);
        }

        return 0;
}

 使用如下sh

#!/usr/local/tcl/bin/expect
spawn ./a.out  # 开启子进程,执行a.out
expect "input"  # 监听 "input"
send "xxxx\n"  
expect "input"  
send "xxxx\n"
expect "input"
send "xxxx\n"
expect "input"
send "xxxx\n"
expect eof
exit

 使用命令行参数

set var [lindex $argv 0]

将第0个命令参数传给 var

与其他sh连用

由于expect一个独立的shell程序,所以无法写在一个文件,只能通过文件调用。

#!/bin/sh
echo "hello world"
./expect.sh

 

4.实战

连接ftp,并留在ftp

#!/usr/local/bin/expect
set user "yangxr\n"
set passwd "yangxr123456\n"
set timeout 20
spawn ftp yun.xxx.cn
expect "Name*" {send $user}
expect "Password*" {send $passwd}
interact


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM