一像寒、概述
我們通過Shell可以實(shí)現(xiàn)簡單的控制流功能疼邀,如:循環(huán)、判斷等妒潭。但是對于需要交互的場合則必須通過人工來干預(yù)悴能,有時(shí)候我們可能會(huì)需要實(shí)現(xiàn)和交互程序如telnet服務(wù)器等進(jìn)行交互的功能。而Expect就使用來實(shí)現(xiàn)這種功能的工具雳灾。
Expect是一個(gè)免費(fèi)的編程工具語言漠酿,用來實(shí)現(xiàn)自動(dòng)和交互式任務(wù)進(jìn)行通信,而無需人的干預(yù)谎亩。Expect的作者Don Libes在1990年 開始編寫Expect時(shí)對Expect做有如下定義:Expect是一個(gè)用來實(shí)現(xiàn)自動(dòng)交互功能的軟件套件 (Expect [is a] software suite for automating interactive tools)炒嘲。使用它系統(tǒng)管理員 的可以創(chuàng)建腳本用來實(shí)現(xiàn)對命令或程序提供輸入,而這些命令和程序是期望從終端(terminal)得到輸入匈庭,一般來說這些輸入都需要手工輸入進(jìn)行的夫凸。 Expect則可以根據(jù)程序的提示模擬標(biāo)準(zhǔn)輸入提供給程序需要的輸入來實(shí)現(xiàn)交互程序執(zhí)行。甚至可以實(shí)現(xiàn)實(shí)現(xiàn)簡單的BBS聊天機(jī)器人阱持。 :)
expect有四個(gè)核心的指令:
spawn:啟動(dòng)新進(jìn)程夭拌,后跟新進(jìn)程要執(zhí)行的指令;
expect:指定要監(jiān)聽的字符串,如果spawn進(jìn)程返回了匹配的字符串(如標(biāo)準(zhǔn)輸入的提示信息)鸽扁,則觸發(fā)send蒜绽;
send:發(fā)送指定的字符串到spawn進(jìn)程,代替標(biāo)準(zhǔn)輸入桶现;
interact:用戶參與交互躲雅;
yum install expect
#change passwd
#!/usr/bin/expect
spawn passwd admin
expect {
"*password: " { send "toor\r"; exp_continue}
"password:" { send "toor\r"}
}
interact
#login in root
#!/usr/bin/expect
spawn su - root
expect "*Password: "
send "toor\r"
interact
#login with no password
#!/bin/bash
SERVERS="192.168.1.241 192.168.1.242"
PASSWD="123456"
function sshcopyid
{
expect -c "
set timeout -1;
spawn ssh-copy-id $1;
expect {
\"yes/no\" { send \"yes\r\" ;exp_contine; }
\"password:\" { send \"$PASSWD\r\";exp_continue; }
};
expect eof;
"
}
for server in $SERVERS
do
sshcopyid $server
done
#!/bin/bash
SERVER="192.168.1.241"
PASSWD=nf123456
expect -c "
set timeout -1;
spawn ssh $SERVER;
expect {
\"yes/no\" { send \"yes\r\" ;exp_contine; }
\"password:\" { send \"$PASSWD\r\"; }
};
expect \"]#\" { send \"ls -la \r\" };
expect \"]#\" { send \"exit \r\" };
expect eof;
"