http://blog.xuite.net/m740138.m740138/blog/25445084

先查看系統有無安裝expect套件
#rpm -qa expect

expect -c " " 框住範圍內,為流程腳本,中間不可以插入 #註解,否則會發生錯誤
expect [偵測螢幕上會出現的字串]
send [出現這個字串時,要如何回應]

偵測字串必須為該行完整字串,不可以只取其中一個單字,否則抓不到
在回應中,雙引號 " 必須寫成 \",反斜線 \ 寫成 \\,\r 代表

下面使用samba的smbpasswd指令作範例

動作:
#smbpasswd -a user           =>建立一個user的登入samba密碼
New SMB password:            =>輸入samba密碼
Retype new SMB password:  =>再次輸入密碼

範例一:使用bash環境
#!/bin/bash
expect -c "
spawn smbpasswd -a ghost
expect \"New SMB password:\"
send \"1234\r\"
expect \"Retype new SMB password:\"
send \"1234\r\"
expect ]#
"
執行方式:直接執行bash XXX.sh即可

範例二:使用expect環境
#!/usr/bin/expect -f
spawn smbpasswd -a user
expect "New SMB password:"
send "1234\r"
expect "Retype new SMB password:"
send "1234\r"
expect eof
執行方式:先將檔案修改成可執行檔chmod a+x XXX.sh
           使用絕對路徑執行./XXX.sh或/tmp/XXX.sh

參考資料:
http://users.csc.calpoly.edu/~dbutler/tutorials/winter96/expect/tutorial.html
http://phorum.study-area.org/index.php/topic,40062.html

 


 

/user/local/bin/check-net.sh

#!/bin/sh

# 檢查網路是否斷線,若斷線呼叫「ADSL 數據機自動重開機腳本」
# 建議寫入 cron 排程,每分鍾固定執行


# 用 ping ISP DNS 的方式,來確認網路是否斷線
# 因為ISP的DNS主機,有時也會掛掉,為避免誤判,所以確認兩家
# 搜尋含 0% 的字串,用 awk 取第6個字串,即封包 lost 率
#
# 該字串內容會類似:
# 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
# 註:0% (網路正常)和 100% lost(網路斷線)都含有 0% 這個內容

checkNet_01=`ping -c 2 168.95.1.1 | grep 0% | awk '{print $6}'`
checkNet_02=`ping -c 2 61.64.127.1 | grep 0% | awk '{print $6}'`

# echo 訊息為 debug 用,取消註解即可顯示
#echo $checkNet_01
#echo $checkNet_02

# 檢查變數是否「not」0%,若條件成立,則代表網路不正常
# 若網路不正常,則呼叫「其它處理腳本或指令」
# 為避免誤判,只有在兩家 ISP DNS 都 ping 不到的情況下,條件才成立

if [ ! "$checkNet_01" == "0%" ] ;then
	if [ ! "$checkNet_02" == "0%" ] ;then 
		# 呼叫其它處理腳本或指令
		# 
	fi
fi



# 呼叫其它處理腳本或指令
那邊你要自己寫進去
例如你的目標是讓 ppp 重播,就在那邊寫入 ppp 重播的指令或腳本。

加入徘程的方法:
編輯 /etc/crontab

語法:
分 時 日 月 周 [執行者] [指令或腳本]

範例:
*/1 * * * * root /user/local/bin/check-net.sh

* 號代表「任何時間」,any time
/ 代表每 n,例如 */1 分代表每分鍾

編輯 /etc/crontab 排程表 後
要重新啟動 cron 排程服務才會生效
# /etc/rc.d/cron restart

-----------------------------------------

ppp 重播是比較容易的,系統自帶有這種工具

我當初寫上面這個檢查網路腳本的目的,是小烏龜都會熱當,系望網路不通時(小烏龜熱當)能重新啟動小烏龜。

小烏龜其實可以 telnet 登入,去下 restart 重新啟動指令。

檢測到網路不通時,讓 Linux 自動去 telnet 小烏龜,登入後自動下重新啟動指令。

聽起來好像線上遊戲的外掛機器人,還有人工智慧...
但這是可以辦到的。關鍵在於利用 expect 這個指令(需裝套件)。

範例:
expect.sh

#!/bin/sh

# =========================================================
# 對話型指令自動化輸入範本 v.01  最後修改日期:2006/06/26
#
# 必要條件:
# 執行此範本需要 expect 套件,請先檢查系統是否有安裝 expect 套件。
# 檢查是否有安裝:rpm -qa | grep expect
# 安裝:yum install expect (tck 是它的相依套件,需一併安裝)
#
# 說明:
# 對話型指令是指如:telnet、ftp、ssh ...等
# 必須使用者介入操作的指令
# 使用此範本,可達到自動化,無須人工操作之目的
# =========================================================


# =================================
# 變數定義
# =================================

# timeout 有兩種意義
# 1.最長等待連接時間,若超過則放棄
# 2.每次出現問答字串時,暫停回應的時間
# 此數值勿設太長,太長的話執行週期要等很久
# 若主機在遠端,回應時間較長,則此數值亦不宜設太短
# 單位:秒
TIMEOUT=2

# 主機名稱或IP
HOSTNAME='192.168.1.1'

# 登入的使用者名稱與密碼
NAME=''
PASSWD=''


# ================================
# 對話型指令自動輸入流程腳本
# ================================

# expect -c " " 框住範圍內,為流程腳本,中間不可以插入 #註解,否則會發生錯誤
# expect [偵測螢幕上會出現的字串]
# send [出現這個字串時,要如何回應]

# 偵測字串必須為該行完整字串,不可以只取其中一個單字,否則抓不到
# 在回應中,雙引號 " 必須寫成 \",反斜線 \ 寫成 \\,\r 代表 <enter>


# 以下為範例腳本,模擬 ALCATEL SPEED TOUCH 340 的 telnet 過程
# 不保證字串一定正確,請使用者自行確認修改後再使用
expect -c "
	set timeout $TIMEOUT

	spawn telnet $HOSTNAME

	expect {
		timeout	exit
		\"password:\"
	}
	send \"$PASSWD\r\"

	expect \"192.168.1.1>\"
	send \"restart\r\"
	
	expect \"192.168.1.1>\"
        send \"@close\r\"

"

# 紀錄重開機次數
echo `date` >> /var/log/adsl-restart.log
echo

http://note.online-linux.net/index.php?op=ViewArticle&articleId=39&blogId=1

先安裝好"tcl"和"expect"套件之後再撰寫script檔


如:

#!/usr/bin/expect

set timeout "6"

set host [lindex $argv 0]
set port [lindex $argv 1]
spawn telnet $host

expect {
timeout { puts stderr "Error_string: Username:"; exit 1 }
"UserName:" { send "test "}
}

expect {
timeout { puts stderr "Error_string: Password:"; exit 1 }
"PassWord:" { send "test "}
}


expect {
timeout { puts stderr "Error_string: Vty-0#"; exit 1 }
"#" { send "show fdb port $port " }
}

expect {
timeout { puts stderr "Error_string: Vty-0#"; exit 1 }
"#" { send "show ports $port description " }
}

expect {
timeout { puts stderr "Error_string: Vty-0#"; exit 1 }
"Quit" { send "q " }
}

 

 

set host [lindex $argv 0] 即設定第一個參數,如shell script的$1,第二個參數以此類推

 

"UserName:" { send "test "},以這一行為例,當等到"UserName"字串時即send出"test"來輸入使用者名稱

 


http://fanqiang.chinaunix.net/a4/b8/20010912/1000001278_b.html

 

arrow
arrow
    全站熱搜

    胖祥 發表在 痞客邦 留言(0) 人氣()