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