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