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 $hostexpect {
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
留言列表